У меня есть небольшой инструмент развертывания, который я обновляю. Инструмент берет версию кода из коробки сборки, обновляет SVN, а затем переносит ее на X-серверы (развертывание перемещает определенные части установок развертывания на другие серверы в стеке).
То, что происходит сейчас, это когда он запускается на чем-то кроме нашего билда, он не будет работать из-за ценных бумаг.
Наша сборочная коробка является внутренней и находится в нашем собственном домене. Серверы, на которые мы копируем, находятся в домене с высоким уровнем безопасности. Я использовал методы, описанные здесь: Доступ к защищенным паролем сетевым дискам в Windows в C #? для доступа к файлам / данным на этих дисках домена, поэтому мне не нужно отображать их.
Но вот подвох.
Build box - Домен A
Развертывание сервера - домен B
Развертывание сервера 2 - домен B
Мой ящик полностью контролирует наш Build Box, поскольку разработчик работает от имени администратора и находится в нашем домене. Тем не менее, как только я имитирую свой логин, чтобы попасть в домен B, я не могу получить доступ к своему блоку сборки домена A.
Это внутренняя утилита, и любая помощь будет признательна.
* Если есть большая работа над этим вместо копирования, я могу открыть новые потоки и запустить командную строку, чтобы получить этих файлов из SVN на каждом сервере, поскольку это возможность вместо копирования. Мы сохраняем все файлы установки install в SVN.
IntPtr token;
if (!Security.Access.LogonUser("ChuckNorris", "a_small_bunny[0]", "OfficeSpace", Security.Enums.LogonType.NewCredentials, Security.Enums.LogonProvider.Default, out token))
{
throw new Win32Exception();
}
try
{
IntPtr dToken;
if (!Security.Access.DuplicateToken(token, Security.Enums.SecurityImpersonationLevel.Impersonation, out dToken))
throw new Win32Exception();
try
{
using (WindowsImpersonationContext iContext = new WindowsIdentity(dToken).Impersonate())
{
Directory.CreateDirectory(destDir); //Works Here as I have impersonation
// copy each file to destination
//This will bomb as my user is now linked to the prod domain.
foreach (string file in Directory.GetFiles(srcDir))
{
// update property bag
UpdatePropertyBag(
propertyBag,
PropertyBag.Step,
"Copying [" + file + "] to [" + destDir + "]");
// copy each file
File.Copy(file, CombinePath(destDir, Path.GetFileName(file)));
}
// deal with each file/folder
foreach (string dir in Directory.GetDirectories(srcDir))
{
// copy each subdirectory
CopyDirectory(propertyBag, srcDir, destDir, Path.GetFileName(dir));
}
iContext.Undo();
}
}
catch (Exception ex)
{
}
finally
{
if (dToken != IntPtr.Zero)
{
if (!Security.Access.CloseHandle(dToken))
{
// Uncomment if you need to know this case.
////throw new Win32Exception();
}
}
}
}
catch (Exception ex)
{
}
finally
{
if (token != IntPtr.Zero)
{
if (!Security.Access.CloseHandle(token))
{
// Uncomment if you need to know this case.
////throw new Win32Exception();
}
}
}