Impersonate

11/12/2009 - 13:36 von Fritz Hilgemann | Report spam
Hallo,

ich habe folgenden Code, um einen impersonated User Context zu erzeugen. Das
Problem: Ich erkenne nicht, ob die Impersionierung geklappt hat oder nicht.
Das fàngt schon damit an, daß LogonUser(...) grundsàtzlich True und auch
einen Token zurückgibt, auch wenn ich unzulàssige Usernamen oder Passwörter
verwende. Auch GetLastError() gibt 0 zurück. Nàchstes, es wird ja ein
WindowsImpersonationContext erzeugt, aber so etwas hat wohl keine
Eigenschaften, von denen ich ablesen kann, ob das der ist, den ich auch
wollte.
Insbesondere das LogonUser() würde mich doch sehr interessieren.
Gruß,
Fritz
private WindowsImpersonationContext impersonatedUser;

[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool LogonUser(
string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken);

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private unsafe static extern int FormatMessage(
int dwFlags,
ref IntPtr lpSource,
int dwMessageID,
int dwLanguageID,
ref String lpBuffer,
int nSize,
IntPtr* arguments);

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError =
true)]
private static extern bool CloseHandle(
IntPtr handle);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError =
true)]
public extern static bool DuplicateToken(
IntPtr existingTokenHandle,
int SECURITY_IMPERSONATION_LEVEL,
ref IntPtr duplicateTokenHandle);

//logon types
const int LOGON32_LOGON_INTERACTIVE = 2;
const int LOGON32_LOGON_NETWORK = 3;
const int LOGON32_LOGON_NEW_CREDENTIALS = 9;

// logon providers
const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_PROVIDER_WINNT50 = 3;
const int LOGON32_PROVIDER_WINNT40 = 2;
const int LOGON32_PROVIDER_WINNT35 = 1;


private void RaiseLastError()
{
int errorCode = Marshal.GetLastWin32Error();
string errorMessage = GetErrorMessage(errorCode);
throw new ApplicationException(errorMessage);
}

public string Connect(string targethost, string username, string
password)
{
string res = "";
bool bRes = false;
IntPtr token = IntPtr.Zero;
IntPtr dupToken = IntPtr.Zero;

bRes = LogonUser(username, targethost, password,
LOGON32_LOGON_NEW_CREDENTIALS,
LOGON32_PROVIDER_DEFAULT, ref token);

bRes = DuplicateToken(token, 2, ref dupToken);
WindowsIdentity newIdentity = new WindowsIdentity(dupToken);
impersonatedUser = newIdentity.Impersonate();

CloseHandle(token);
return bRes;
}
 

Lesen sie die antworten

#1 Kerem Gümrükcü
11/12/2009 - 14:54 | Warnen spam
Hallo Fritzt,

Das fàngt schon damit an, daß LogonUser(...) grundsàtzlich True und auch
einen Token zurückgibt, auch wenn ich unzulàssige Usernamen oder
Passwörter verwende.



Das ist nichts, da stimmt was nicht,...

Auch GetLastError() gibt 0 zurück.



Ebenso schlecht,...

Nàchstes, es wird ja ein WindowsImpersonationContext erzeugt, aber so
etwas hat wohl keine Eigenschaften, von denen ich ablesen kann, ob das der
ist, den ich auch wollte.



Nein, das nicht, aber ein WindowsIdentity-Objekt macht dich glücklich,
was Du so bekommst:

WindowsIdentity wi = new WindowsIdentity(DeinUserTokenHandle);

Schau Dir die Eigenschaften von dem WindowsIdentity-Objekt an,
dann blühst Du auf,... ;-)

Du machst da irgendwas falsch, aber folgende Dinge
zuerst:

1. Für was willst Du genau ein Impersonate machen?
2. Die Signaturen müssen wie folgt aussehen:

[DllImport("kernel32.dll", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CloseHandle(IntPtr hObject);

[DllImport("advapi32.dll",
SetLastError = true,
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool LogonUser(
string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
out IntPtr phToken);

[DllImport("advapi32.dll", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int
SECURITY_IMPERSONATION_LEVEL, out IntPtr DuplicateTokenHandle);


Das mit dem FormatMessage brauchst Du für Fehlerübersetzung
nicht, "falls" Du es dafür nimmst, denn ein einfaches "new Win32Exception()"
liefert Dir gleich ein fertiges Exception Objekt mit Fehlercode und
Übersetzung!
Arbeitest Du eigentlich im Unsafe Kontext, oder warum der Zeiger?

Hier ist ein Program von mir (mit vollem Quellcode!)
das Dir zeigt, wie man ein erfolgreiches Impersonate
durchführt, bevor ich das ewig hier erklàre:

[restarts - The powerful alternative to SC Command]
http://restarts.codeplex.com/wikipage

Wenn Du restarts startest, dann starte es mal mit dem Parameter "-help",
dann gibts ne lange Liste mit Parametern und ausführlicher Erklàrung.
Für dich ist der Parameter "i|-impersonate" von interesse und schau Dir
dazu die Implementierung im Code an, die auch recht "straight" zu lesen
ist,...

Viel Erfolg,...wenn Du Fragen hast, gerne,...

Grüße

Kerem

Beste Grüsse / Best regards / Votre bien devoue
Kerem Gümrükcü
Latest Project: http://www.pro-it-education.de/soft...iceremover
Latest Open-Source Projects: http://entwicklung.junetz.de

Ähnliche fragen