C# 在不在同一域中的两个受保护源之间复制文件
我有一个正在升级的小型部署工具。该工具从构建框中获取一个版本的代码,更新SVN,然后将其放到X服务器上。部署将部署安装的特定部分移动到堆栈中的不同服务器上 现在发生的事情是,当它运行在除我们的构建框之外的任何东西上时,由于安全问题,它将无法工作 我们的构建框是内部的,在我们自己的域中。我们要复制到的服务器位于高安全域上。我使用了这里介绍的技术:用于访问那些域驱动器上的文件/数据,所以我不需要映射它 但问题是 构建框-域A 部署服务器-域B 部署服务器2-域B “我的盒子”可以完全控制我们的构建盒子,因为开发人员是以管理员身份运行的,并且它位于我们的域中。但是,一旦我模拟了我的登录,所以我在域B上,我就无法访问我的域A构建框 这是一个内部实用程序,任何帮助都将不胜感激 *如果在这方面有大量的工作而不是复制,我可以打开新的线程并运行命令行从每台服务器上的SVN获取这些文件,因为这是一种替代复制的可能性。我们将所有部署安装文件保存在SVN中C# 在不在同一域中的两个受保护源之间复制文件,c#,security,svn,.net-2.0,network-drive,C#,Security,Svn,.net 2.0,Network Drive,我有一个正在升级的小型部署工具。该工具从构建框中获取一个版本的代码,更新SVN,然后将其放到X服务器上。部署将部署安装的特定部分移动到堆栈中的不同服务器上 现在发生的事情是,当它运行在除我们的构建框之外的任何东西上时,由于安全问题,它将无法工作 我们的构建框是内部的,在我们自己的域中。我们要复制到的服务器位于高安全域上。我使用了这里介绍的技术:用于访问那些域驱动器上的文件/数据,所以我不需要映射它 但问题是 构建框-域A 部署服务器-域B 部署服务器2-域B “我的盒子”可以完全控制我们的构建盒
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();
}
}
}
我可能在上面的流程中遗漏了一些东西,但你能: 模拟域A 复制到具有两个域权限的共享位置。 模拟域b,移动到最终位置。 其他选项包括读取文件详细信息、加载到内存中、写入目标并在必要时保留时间戳。