Я пытаюсь написать приложение C#, которое выдаст себя за клиента на сервере, чтобы выполнить некоторый запрос LDAP.Выдающий себя клиенту Windows на сервере
Клиент отправляет duplicateToken на сервер, и сервер должен использовать его для выдачи себя за Клиента. На стороне сервера это не работает, получив getLastWin32Eror: 203
Приложения для клиентов и серверов работают в настоящее время на одном компьютере, но в будущем этого не произойдет.
На клиенте:
[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, как этот конкретный пользователь-олицетворение.
EDIT: Я обновил код, который вызывает ImpersonateLoggedOnUser функцию, чтобы получить последнюю ошибку:
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool ImpersonateLoggedOnUser(IntPtr phToken);
Теперь вызова getLastWin32Eror возвращает ошибку 6.
Так в чем же ошибка? –
обновлено @BrianDesmond –