[C++ / WinAPI] Programm als anderer User ausführen

kickerxy123

Erfahrenes Mitglied
Hallo Community!

Ich habe mal wieder ein Problem.
Rahmenbedingungen:
--Dev-Cpp 5.0
--Windows 7 Enterprise [soll auch auf WinXP WinServer2003 und WinServer2008 lauffähig sein]

Zum Problem:
Ich möchte von einem Server gewisse Informationen per WinAPI abrufen und verändern.
dies klappt soweit auch ohne Probleme. Da der Account meiner Workstation mit der ich programmiere in der Domäne zu wenig Rechte hat, brauch ich in meinem Programm eine "RunAsOtherUser"-Funktionalität.
Hier mein Quelltext- Ausschnitt:
C++:
string loginName = "Peter";
string loginDomain = "domaincontroller.subdomäne.domäne.com.";//FQDN
string loginPw = "Passwort";
HANDLE networkToken = NULL;

CHAR* cLoginName    = (CHAR*)&loginName[0];
CHAR* cLoginDomain  = (CHAR*)&loginDomain[0];
CHAR* cLoginPw      = (CHAR*)&loginPw[0];  

if(0 == LogonUserA(cLoginName, cLoginDomain, cLoginPw, LOGON32_LOGON_INTERACTIVE,  
                             LOGON32_PROVIDER_DEFAULT, &networkToken))
{
           //ErrorHandling ergibt "ERROR_LOGON_FAILURE" -->bad credentials
}

Jetzt weiß ich nicht, woran genau der Aufruf scheitert.
Eine weitere Abfrage mit
C++:
//Pseudocode
NetUserGetInfo(loginDomain, loginName,0,0)
liefert mir SUCCESS. Daraus folgere ich eigentlich, dass der Domaincontroller den User kennt. Dass das Passwort richtig ist, weiß ich natürlich.....

Hat jemand eine idee? Zu erwähnen wäre vielleicht noch, dass das ganze mit UNICODE kompiliert wird; die Funktion LogonUser aber nicht (LogonUserA(....)).

Weiß da jemand Rat?

Vielen Dank,
kickerxy
 
Zuletzt bearbeitet:
Hi.

Also erstmal ist soetwas:
C++:
string loginName = "Peter";
CHAR* cLoginName    = (CHAR*)&loginName[0];
ziemlicher Unfug. Die C-Strings sind nicht terminiert.

Verwende die std::string::c_str() Methode am besten direkt im LogonUserA Aufruf.

Gruß
 
Hallo deepthroat,

habe den Fehler ausgebessert; hat aber leider nicht viel gebracht.
Hier der neue Aufruf:
C++:
if(0 == LogonUserA((CHAR*)loginName.c_str(), (CHAR*)loginDomain.c_str(), (CHAR*)loginPw.c_str(), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &networkToken))
Unter Unicode klappts eben so wenig... So sieht mein Programm jetzt aus:
C++:
                                      wchar_t wLoginDomain[1024], wLoginName[1024], wLoginPw[1024];
                                      MultiByteToWideChar(CP_ACP, 0, loginDomain.c_str(), -1, &wLoginDomain[0], 1023);
                                      MultiByteToWideChar(CP_ACP, 0, loginName.c_str(), -1, &wLoginName[0], 1023);     
                                      MultiByteToWideChar(CP_ACP, 0, loginPw.c_str(), -1, &wLoginPw[0], 1023);               
          
                         //    if(0 == LogonUserA((CHAR*)loginName.c_str(), (CHAR*)loginDomain.c_str(), (CHAR*)loginPw.c_str(), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &networkToken))
                             if(0 == LogonUser(wLoginName, wLoginDomain, wLoginPw, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &networkToken))
                             {
                                 long errorcode = GetLastError();
                                 if(errorcode == ERROR_LOGON_FAILURE)
                                 { 
                                      LPUSER_INFO_0 pBuf = NULL;

                                      cout << "bad credentials";
                                      long ret = NetUserGetInfo(wLoginDomain, wLoginName, 0, (LPBYTE*) &pBuf);    
                                      if(ret != NERR_Success)
                                      {
                                           
                                           switch(ret)
                                           {
                                               //blabla                                           
                                            }     
                                      }else cout << "Benutzername ist bekannt. Das Passwort wurde nciht akzeptiert\n";
                                 }

Ergebnis: wenn ich einen wirklich ungültigen Benutzer angebe, kommt wie gewünscht: "falscher Benutzername" (kommt aus dem "Switch(ret)") wenn ich eine gültige Kombination eingebe, kommt "Benutzername bekannt; Pw falsch"...

Danke und Gruß,
kickerxy
 
Zuletzt bearbeitet:
Hi.

Wo kommen denn die Login-Informationen her? Sind dort im Passwort Sonderzeichen enthalten? Evtl. stimmt die genutzte Kodierung nicht...

Gruß
 
Hi,
hier kommen die Informationen her:
C++:
hEditLoginName    = createWindow("edit", "", 215, 190, 300, 25, ID_ED_LOGINNAME);
hEditPassword     = createWindow("edit", "", 215, 220, 300, 25, ID_ED_PASSWORD, ES_PASSWORD);
//...
string loginPw        = getTextFromWindow(hEditPassword);
string loginName   = getTextFromWindow(hEditLoginName);
stringLoginDomain = "servername.subdomain.domain.com.";
//hier folgt dann der schon gepostete Rest
//...

//und die zugehörigen funktionen:
string getTextFromWindow(HWND window)
{
char buffer[1024];
GetWindowTextA(window, buffer, GetWindowTextLength(window)+1);
string tmp;
tmp = buffer;
return tmp;
}

HWND createWindow(string type, string caption, unsigned short _x, unsigned short _y, unsigned short _width, unsigned short _height, unsigned long _ID, int _para)
{
HWND tmp = CreateWindowExA(WS_EX_CLIENTEDGE,
                                   type.c_str(),
                                   caption.c_str(),  
                                   WS_CHILD | WS_VISIBLE | _para,
                                   _x, _y, _width, _height,
                                   g_hwnd,
                                   (HMENU)_ID,
                                   NULL,
                                   NULL);
ShowWindow(tmp, SW_SHOW);     
return tmp;     
}

Ich habe grade testweise einen Account angelegt, der keine Sonderzeichen enthielt: "testuser" mit einem Passwort der Länge 8 (Klein-/Großbuchstaben + eine Zahl am Ende; wegen einer Grouppolicy kann ich kein Pw wählen, welches nur aus Kleinbuchstaben besteht). Dennoch kein Erfolg (Hinweis: wenn ich meine .exe mittels runas /user:... meinprog.exe aufrufe, klappt es ohne Probleme. Es liegt also kein generelles Rechteproblem o.ä. vor, sondern es muss an meinem Programm liegen).

Danke und Gruß,
kickerxy
 
Zuletzt bearbeitet:
Hi,

also ich weiß bis jetzt nicht, wo der Fehler liegt..
Ich habe das ganze nun anders gelöst:
ich authentifiziere mich nun mittels WNetAddConnection3(..) beim Server. Alle weiteren Anfragen sind damit ja auch authentifiziert.

Damit ist das für mich erledigt.
Danke und Gruß,
kickerxy123
 
Zurück