2015-11-06 3 views
0

Я пытаюсь написать приложение 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.

+0

Так в чем же ошибка? –

+0

обновлено @BrianDesmond –

ответ

0

Я прошел IntPtr, которые представляют Ручку на сервер после с его преобразованием имеет строку. Это работает на клиенте, но сервер, работающий в другом процессе, не может использовать TokenHandle ...

Смежные вопросы