[.net]Impersonation

Pagina: 1
Acties:

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Ik ben bezig met een applicatie waarvoor ik een user moet impersonaten. Op zich heb ik hier code voor die goed werkt op meerder computers. Alleen bij de computer waar ik nu op aan het ontwikkelen ben wil het maar niet goed werken.

Eerst even een stukje code waar het fout loopt
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[DllImport("advapi32.dll")]
private static extern bool LogonUser( 
    String userName,
    String domainName,
    String password, 
    int LogonType, 
    int LogonProvider, 
    ref IntPtr TokenHandle );

....
....
IntPtr token = new IntPtr(0);
bool result = LogonUser(userAccountName, domain , password, (int)logonType, (int)Impersonation.LogonProvider.LOGON32_PROVIDER_DEFAULT, ref token);

int errorCode = System.Runtime.InteropServices.Marshal.GetLastWin32Error();


logonType is hier LOGON32_LOGON_INTERACTIVE

Het vreemde is dat de returnvalue van LogonUser bij deze computer altijd false is. Volgens de documentatie van LogonUser zou bij een return value false via GetLastError ( In .net dus GetLastWin32Error ) de error op te vragen moeten zijn
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
Maar errorCode blijft ook gelijk aan 0 wat dus als message heeft "The operation completed successfully."

Ik denk dat ik op mijn computer ergens nog wat aan de security policy moet veranderen maar omdat ik ook geen foutmelding krijgt zou ik niet weten waar. Weet iemand mischien waar het fout gaat of een manier om alsnog een melding te krijgen waarom de functie LogonUser false als return value geeft?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:55

Creepy

Tactical Espionage Splatterer

De functie LogonUser geeft een integer terug. Een 0 als het niet gelukt is, en iets anders als het gelukt is. LogonUser geeft dus geen boolean terug, en het is niet nodig om met GetLastWin32Error() de error code op te halen.

[ Voor 16% gewijzigd door Creepy op 13-07-2004 14:37 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
BOOL LogonUser(
LPTSTR lpszUsername,
LPTSTR lpszDomain,
LPTSTR lpszPassword,
DWORD dwLogonType,
DWORD dwLogonProvider,
PHANDLE phToken
);
Volgens de documentatie geeft hij dus wel een Boolean terug.
En in het stukje doc dat ik in mijn vorige post gequote had staat ook dat je dan via GetLastError de error code op moet halen.

Tevens blijft mijn phToken ook gewoon op 0 staan wat dus aangeeft dat de impersonation niet gelukt is anders zou het token niet meer gelijk aan 0 moeten zijn.

[ Voor 19% gewijzigd door Woy op 13-07-2004 14:35 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:55

Creepy

Tactical Espionage Splatterer

Waar haal je dan die quote vandaan? Want daarin zeg je zelf dat het een boolean moet zijn.

Hmmja... 0 = false in C.. figures..
Sorry, niks gezegd :)

[ Voor 26% gewijzigd door Creepy op 13-07-2004 14:36 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Creepy schreef op 13 juli 2004 @ 14:34:
Waar haal je dan die quote vandaan? Want daarin zeg je zelf dat het een boolean moet zijn.
Uit de MSDN functie defenitie van LogonUser

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 19-05 13:17
Wat voor windows gebruik je? Op Windows 2000 is het namelijk bijna niet mogelijk, tenzij je de complete securitypolicy omgooit...

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
PhoneTech schreef op 13 juli 2004 @ 14:40:
Wat voor windows gebruik je? Op Windows 2000 is het namelijk bijna niet mogelijk, tenzij je de complete securitypolicy omgooit...
Het is inderdaad op Windows 2000. Het vreemde is dat het op de server ( Waar ook windows 2000 op draait ) Wel gewoon op werkt. ( Daar is inderdaad wel een hoop aan de security policy veranderd ).

Maar het vreemdste vindt ik nog dat ik geen errorCode terug krijg. Ik ben een tijd geleden ook al eens met impersonation bezig geweest maar toen kreeg ik telkens gewoon netjes een errorcode als het impersonaten niet lukte.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Ik zou van die bool toch eens een integer maken. (De return-value van die method dus).

In .NET kan je een bool niet gelijkstellen met 1 of 0, zoals je dat in C/C++ wel kunt.

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Ik heb het voor de zekerheid nog even getest maar dan krijg ik dus ook 0 als return value.

Deze code werkt dus wel op een andere computer met windows xp en op een testserver met windows 2000 ( waar wel een hoop veranderd is aan de security policy ).
Op deze andere computers komt er dus ook netjes true uit als de Impersonation gelukt is.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 19-05 13:17
Hier is de link waar ik naar zocht:

Quote uit de link: http://msdn.microsoft.com...ClassImpersonateTopic.asp
// This sample demonstrates the use of the WindowsIdentity class to impersonate a user.
// IMPORTANT NOTES:
// This sample can be run only on Windows XP. The default Windows 2000 security policy
// prevents this sample from executing properly, and changing the policy to allow
// proper execution presents a security risk.
// This sample requests the user to enter a password on the console screen.
// Because the console window does not support methods allowing the password to be masked,
// it will be visible to anyone viewing the screen.
Windows XP heeft een toevoeging aan de system login service wat impersonating toe staat.
Een workaround is runas of sanur (runas met password in de command line) en dan het programma laden...

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Ik heb inderdaag gevonden dat je het "SE_TCB_NAME privilege" moet hebben. Deze krijg je door ""Act as part of the Operating System" right toe te kennen. Dit ga ik nou nog even proberen. Maar als dat het probleem zou zijn dan zou je toch wel een ErrorCode verwachten.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Met "Act as part of the Operating System" werkt het nu dus wel goed, ik snap alleen nog steeds niet waarom ik geen errorcode kreeg.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1