在服务器上模拟Windows客户端

时间:2015-11-06 14:58:42

标签: c# active-directory ldap client-server

我正在尝试编写一个C#应用程序,它将模拟服务器上的客户端执行某些LDAP请求。

客户端将duplicateToken发送到服务器,服务器应使用它来模拟客户端。 在服务器端,它不起作用,得到getLastWin32Eror:203

客户端和服务器应用程序当前在同一台PC上运行,但未来情况并非如此。

在客户端:

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

 /// {...}
 IntPtr duplicateToken = IntPtr.Zero;
 IntPtr currentToken = WindowsIdentity.GetCurrent(TokenAccessLevels.Duplicate).Token;
 DuplicateToken(currentToken, 3, ref duplicateToken);
 //if I try ImpersonateLoggedOnUser(duplicateToken) here it works
 //Send the duplicateToken to the Server

在服务器上:

 /// {...}
 //get the clientToken from the Client
 bool isValid = ImpersonateLoggedOnUser(duplicateToken);
 if (!isValid)
 {
     int winerr = System.Runtime.InteropServices.Marshal.GetHRForLastWin32Error();
     int winerr2 = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
 }

服务器和客户端未在同一个线程中运行。 你知道我是否必须将令牌附加到新的线程来冒充?或者有没有办法使用此令牌充当客户端。

我只需要Impersonate作为此特定模拟用户发送一些LDAP请求。

编辑:我更新了调用ImpersonateLoggedOnUser函数的代码以获取最后一个错误:

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

现在调用getLastWin32Eror会返回错误6。

1 个答案:

答案 0 :(得分:0)

在转换后,我将表示Handle的IntPtr传递给服务器,它有一个String。 这适用于客户端,但在另一个进程中运行的服务器无法使用TokenHandle ...