2017-03-16 9 views
0

Ich versuche, ein Programm zu starten, das ein anderes Programm als ein anderer Benutzer mit der Win32-Funktion CreateProcessWithLogon auf einem Windows 7-System startet, aber es gibt Fehler 120 zurück, der Funktion nicht unterstützt.CreateProcessWithLogon gibt Funktion nicht unterstützt

Wenn ich das Programm in den Befehl ausführen, funktioniert es korrekt. Wenn ich auf der anderen Seite das Programm mit ShellExecute starte, bekomme ich den Fehler.

Befehlszeile -> Programm A starten -> Programm A führt CreateProcessWithLogon aus. OK 32-Bit-Programm -> Programm A starten -> Programm A führt CreateProcessWithLogn aus. ERROR

 if (!CreateProcessWithLogonW(L"username", L"domain", L"password", 
     LOGON_NETCREDENTIALS_ONLY, L"C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe", L"iexplore", 
     NULL, NULL, NULL, 
     &si, &pi)) 
     DisplayError(L"CreateProcessWithLogonW"); 

Antwort

1

wenn Sie möchten, startet Programm als ein anderer Benutzer nicht LOGON_NETCREDENTIALS_ONLY Flag verwenden - verwenden LOGON_WITH_PROFILE statt.

STARTUPINFO si = { sizeof(si) }; 
    PROCESS_INFORMATION pi; 
    if (CreateProcessWithLogonW(L"username", L"domain", L"password", LOGON_WITH_PROFILE, 
     L"C:\\windows\\notepad.exe", L"notepad.exe", 0, NULL, NULL, &si, &pi)) 
    { 
     CloseHandle(pi.hThread); 
     CloseHandle(pi.hProcess); 
    } 

wenn Sie Flag verwenden LOGON_NETCREDENTIALS_ONLY

Das System nicht die angegebenen Anmeldeinformationen validieren.

so wirklich brauchen Sie keinen echten Namen oder Passwort. weil das System nicht wirklich Login tun, sondern

Das neue Verfahren die gleichen Token wie der Aufrufer verwendet, aber das System eine neue Anmeldesitzung innerhalb LSA Klon Anrufer aktueller Token

so dass diese Anmeldetypen erzeugt aber Geben Sie eine neue Anmeldesitzung ein. LpUsername muss im UPN-Format sein - - Ihr Programm als denselben Benutzer (SID, Gruppen, Berechtigungen), aber in separater Anmeldesitzung

nur einen Trick notwendig, nicht dokumentiert ausgeführt wird @ Symbol enthält .

so muss der Code wie folgt sein:

STARTUPINFO si = { sizeof(si) }; 
    PROCESS_INFORMATION pi; 
    if (CreateProcessWithLogonW(L"@", 0, 0, LOGON_NETCREDENTIALS_ONLY, 
     L"C:\\windows\\notepad.exe", L"notepad.exe", 0, NULL, NULL, &si, &pi)) 
    { 
     CloseHandle(pi.hThread); 
     CloseHandle(pi.hProcess); 
    } 

als Ergebnis werden neue LogonSession erstellt werden mit NewCredentials als SECURITY_LOGON_TYPE, AuthenticationPackage == Negotiate

+0

Danke für die Info, aber LOGON_WITH_PROFILE den gleichen Fehler produziert. – Karlth

+0

@Karlth Ich habe natürlich eigenen Code (om Win7 auch) getestet und es funktioniert gut. Wenn Ihr Code-Snippet genau ausgeführt wird - habe ich einen anderen Fehler - 'ERROR_INVALID_LOGON_TYPE', der weg ist, wenn' LOGON_NETCREDENTIALS_ONLY' entfernt wurde oder es mit L "@" als Benutzernamen verwendet wird. Wenn Sie einen anderen Fehler haben - Sie müssen debuggen. möglicherweise Fehler in Ihrem Prozess, aber schneller von allem, was Sie brauchen, setzen Sie bp in 'svchost.exe -k netvsvcs 'Prozess auf' seclogon.SlrCreateProcessWithLogon' und debuggen Sie es - http://i.imgur.com/euZrIio.png oder möglicherweise debug lsass.exe, wenn der Fehler von 'LsaLogonUser' zurückgegeben wird – RbMm

Verwandte Themen