在服务器上模拟 Windows 客户端
Impersonating Windows Client on 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();
}
服务器和客户端运行不在同一个线程中。
你知道我是否必须将令牌附加到新线程才能模拟吗?或者有没有办法使用这个令牌作为客户端。
我只需要模拟作为这个特定的模拟用户发送一些 LDAP 请求。
编辑:我更新了调用 ImpersonateLoggedOnUser 函数的代码以获取最后一个错误:
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool ImpersonateLoggedOnUser(IntPtr phToken);
现在调用 getLastWin32Eror returns 错误 6.
我将表示Handle 的IntPtr 转换为String 后传递给服务器。
这适用于客户端,但另一个进程中的服务器 运行 无法使用 TokenHandle...
我正在尝试编写一个 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();
}
服务器和客户端运行不在同一个线程中。 你知道我是否必须将令牌附加到新线程才能模拟吗?或者有没有办法使用这个令牌作为客户端。
我只需要模拟作为这个特定的模拟用户发送一些 LDAP 请求。
编辑:我更新了调用 ImpersonateLoggedOnUser 函数的代码以获取最后一个错误:
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool ImpersonateLoggedOnUser(IntPtr phToken);
现在调用 getLastWin32Eror returns 错误 6.
我将表示Handle 的IntPtr 转换为String 后传递给服务器。 这适用于客户端,但另一个进程中的服务器 运行 无法使用 TokenHandle...