模拟服务器上的Windows客户端

问题描述:

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

客户端将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(); 
} 

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

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

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

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

现在呼吁getLastWin32Eror返回错误6.

+0

那么错误是什么? –

+0

已更新@BrianDesmond –

我通过了代表后处理对服务器的IntPtr转换它有一个字符串。 这适用于客户端,但在另一个进程中运行的服务器不能使用TokenHandle ...