Скопируйте файлы между 2 защищенными источниками, которые не находятся в одном домене. - PullRequest
0 голосов
/ 26 октября 2011

У меня есть небольшой инструмент развертывания, который я обновляю. Инструмент берет версию кода из коробки сборки, обновляет 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();
        }
    }
}

1 Ответ

0 голосов
/ 26 октября 2011

Я мог что-то пропустить в потоке выше, но вы можете:

  1. Олицетворение домена A
  2. Копировать в общее местоположение с разрешениями для обоих доменов.
  3. Олицетворять домен b, перейти в конечное местоположение. Другими вариантами являются чтение сведений о файле, загрузка в память, запись в место назначения и сохранение метки времени, если это необходимо.
...