日期:2014-05-18  浏览次数:20821 次

远程文件copy问题
A地操作,从B地copy共享文件到C地。
B和C没有直接连通,而是通过A串联,A、B是本地登录,B中文件共享给一个本地用户,C是在域中共享给erveryone。
我目前能做到的是分两步,先在A地模拟一个角色(B中的本地用户),把文件copy到A地,再在A地模拟一个角色(域中的用户),把A地的文件copy到C地。
我现在想直接一步就从B地copy到C地,怎么解决B和C地需要的权限不一样的问题!
求给代码和解释!
谢谢!
角色模拟的代码如下:
  //角色模拟部分
  // logon types
  //const int LOGON32_LOGON_INTERACTIVE = 2;
  //const int LOGON32_LOGON_NETWORK = 3;
  const int LOGON32_LOGON_NEW_CREDENTIALS = 9;
  // logon providers
  const int LOGON32_PROVIDER_DEFAULT = 0;
  //const int LOGON32_PROVIDER_WINNT50 = 3;
  //const int LOGON32_PROVIDER_WINNT40 = 2;
  //const int LOGON32_PROVIDER_WINNT35 = 1;

  [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  public static extern int LogonUser(String lpszUserName,
  String lpszDomain,
  String lpszPassword,
  int dwLogonType,
  int dwLogonProvider,
  ref IntPtr phToken);

  [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  public static extern int DuplicateToken(IntPtr hToken,
  int impersonationLevel,
  ref IntPtr hNewToken);

  [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  public static extern bool RevertToSelf();

  [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
  public static extern bool CloseHandle(IntPtr handle);

  private WindowsImpersonationContext impersonationContext;

  public bool impersonateValidUser(String userName, String domain, String password)
  {
  WindowsIdentity tempWindowsIdentity;
  IntPtr token = IntPtr.Zero;
  IntPtr tokenDuplicate = IntPtr.Zero;

  if (RevertToSelf())
  {
  if (LogonUser(userName, domain, password, LOGON32_LOGON_NEW_CREDENTIALS,
  LOGON32_PROVIDER_DEFAULT, ref token) != 0)
  {
  if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
  {
  tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
  impersonationContext = tempWindowsIdentity.Impersonate();
  if (true)
  {
  AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
  IPrincipal pr = System.Threading.Thread.CurrentPrincipal;
  IIdentity id = pr.Identity;
  CloseHandle(token);
  CloseHandle(tokenDuplicate);
  return true;
  }
  }
  }
  }
  if (token != IntPtr.Zero)
  CloseHandle(token);

  if (tokenDuplicate != IntPtr.Zero)
  CloseHandle(tokenDuplicate);

  return false;
  }

  public void undoImpersonation()
  {
  impersonationContext.Undo();
  }



------解决方案--------------------

帮顶.