2011-09-20 20 views
6

Próbowałem użyć LogonUser(...), aby uzyskać token dostępu dla konta użytkownika, tak jak w przypadku this MSDN sample.Dlaczego LogonUser (...) nie działa dla kont domeny?

// Call LogonUser to obtain a handle to an access token. 
bool returnValue = LogonUser(userName, domainName, Console.ReadLine(), 
    LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, 
    out safeTokenHandle); 

Kiedy biegnę próbkę (z uprawnieniami administratora) to działa dobrze, gdy dana domenę . i lokalną nazwę konta użytkownika i hasło, ale bez względu na to, co robię, mam kod błędu niewydolności 1326 (logowania : nieznana nazwa użytkownika lub złe hasło), jeśli próbuję użyć konta domeny. Otrzymuję taki sam wynik, jeśli wprowadzam śmieci do domeny, co sprawia, że ​​zastanawiam się, czy faktycznie kontaktuje się z DC.

Co mogłoby powstrzymać to działanie?

+1

To może być spowodowane niestety wieloma problemami. Czy urządzenie jest podłączone do domeny? Czy użytkownik domeny może logować się na tym komputerze? Czy ustawienia DNS są poprawnie skonfigurowane? (Widziałem artykuł Citrix, który sugerował, że to może być problem). Poniższy artykuł zawiera informacje o tym, co dzieje się po wpisaniu śmieci do domeny - https://groups.google.com/group/microsoft.public.dotnet.languages.csharp/msg/dccfbf8b76120401?pli=1 –

+0

Czy sprawdzono, czy działa to bez wywołania Console.ReadLine() (np. dostarczając hasło bezpośrednio jako ciąg znaków)? –

+0

Nie ma znaczenia, skąd pochodzi hasło - jest to ciąg znaków przekazywany do 'LogonUser'. – GraemeF

Odpowiedz

0

Zastosowanie DOMAIN\LOGIN z pustym nazwa_domeny w takim razie ...

+0

Otrzymuję ten sam błąd zarówno dla domeny "DOMAIN \ USERNAME", jak i dla domeny "USERNAME @ DOMAIN" z pustą nazwą domeny przekazaną do 'LogonUser'. – GraemeF

1

W moim przypadku to był fakt, że choć byłem zalogowany do komputera jako użytkownik domeny, mój komputer nie był sam częścią domena. Po dodaniu do domeny próbka zaczęła działać.

+7

Jak zalogować się do komputera jako użytkownik domeny, gdy nie jest przyłączony do domeny? – WilfriedVS

1

W moim przypadku problem, podobny do pytania pytającego, polegał na tym, że konto, na którym próbowałem się uwierzytelnić, znajdowało się w domenie, do której należał mój obecny komputer. W przeciwieństwie do oryginalnego plakatu, moja maszyna nie powinna i nie może być częścią tej drugiej domeny. Chciałem jednak, aby login działał na zasobie w tej domenie.

Odpowiedź była następująca

bool success = LogonUser(
       userName, 
       domain, 
       password, 
       (int)LOGON32_LOGON_NEW_CREDENTIALS, //9 
       (int)LOGON32_PROVIDER_DEFAULT, //0 
       out userToken); 

z następujących stałych zdefiniowanych:

public const int LOGON32_LOGON_NEW_CREDENTIALS = 9; 
public const int LOGON32_PROVIDER_DEFAULT = 0; 

Mam nadzieję, że to pomoże innym, którzy są utracone w podobnej sytuacji.