![]() |
Problem mit Sicherheitskennung bei CreateProcessAsUser
Hallo!
Wie in meinem andern Thread angekündigt, ein neuer Thread für ein Problem in der gleichen Methode. Es geht um den Aufruf CreateProcessAsUser. Der Fehler tritt nur sporadisch auf und zeigt sich wie folgt: Die Methode CreateProcessAsUser wird laut Rückgabewert korrekt ausgeführt. Tatsächlich wurde der Prozess jedoch garnicht gestartet! Ein GetLastError nach dem CreateProcessAsUser liefert folgendes Ergebnis: "Diese Sicherheitskennung kann nicht als Besitzer des Objekts zugeordnet werden" Das ist natürlich ein großes Problem. Hintergrundinfo: Das ganze wird in einem Service aufgerufen und der es werden die Anmeldedaten des Administratorkontos verwendet, welches auch jetz im Moment angemeldet ist. Das Problem tritt nich immer auf, gestern lief das ganze stundenlang problemlos, bis dann abends auf einmal der Fehler auftauchte. Ab da ging dann garnichtsmehr. Edit: Sehr seltsam ist auch, dass die Meldung nach einem Neustart des Rechners erstmal nichtmehr kommt... ma schaun wie lang.. Edit2: Noch seltsamer: Nachdem ich die exe-Datei von dem Dienst austausche kommt der Fehler wieder...
Delphi-Quellcode:
Ich hoffe jemand kann mir einen Tipp geben, ich hab zwar bissl was gefunden über google, aber das sind dann alles sachen wo es drum geht den Prozess in irgendwelche Sessions zu schubsen, oder wo es ein Problem beim Einrichten von Gruppenrichtlinien gibt.
procedure TMyDienst.CreateNewUserProcess(AUser, APassword, ADomain, AProgram : string);
var ltoken,ltoken2 : Cardinal; LEnv : Pointer; pi : TProfileInfo; si : STARTUPINFO; pri : _PROCESS_INFORMATION; sil : TSecurityImpersonationLevel; LUser, LDomain, LPassword, LProgram : string; // reg : TRegistry; err : Integer; created : LongBool; begin try LUser:=AUser; LPassword:=APassword; LDomain:=ADomain; LProgram:=AProgram; try FillChar(sil,SizeOf(TSecurityImpersonationLevel),#0); sil := SecurityIdentification; if LogonUser(PAnsiChar(LUser),PAnsiChar(LDomain),PAnsiChar(LPassword),LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,ltoken)then begin if DuplicateTokenEx(ltoken,TOKEN_ALL_ACCESS,nil,sil,TokenPrimary,ltoken2)then begin fillchar(pi,sizeof(TProfileInfo),#0); pi.dwSize:=sizeof(TProfileInfo); pi.lpUserName:=PAnsiChar(LUser); if(LoadUserProfile(ltoken2,pi))then begin if (CreateEnvironmentBlock( lenv, ltoken2, true //false ))then begin FillChar(pri,sizeof(_PROCESS_INFORMATION),#0); ZeroMemory(@si,sizeof(si)); err:=GetlastError; if err<>0 then SNLogger.Log(SysErrorMessage(err),ltBoth); created:= CreateProcessAsUser( ltoken2, nil, PAnsiChar(LProgram), nil, nil, false, CREATE_UNICODE_ENVIRONMENT or CREATE_NEW_PROCESS_GROUP or NORMAL_PRIORITY_CLASS or CREATE_NO_WINDOW, //TODO: Priorität einstellen? lenv, nil, si, pri ); if(created = LongBool(0))then SNLogger.Log('Prozess konnte nicht gestartet werden.',ltBoth) else SNLogger.Log('Prozess erfolgreich gestartet.'+BoolToStr(created),ltBoth);//<------ Das hier wird ausgeführt err:=GetlastError; if err<>0 then SNLogger.Log('Prozess konnte nicht gestartet werden. '+SysErrorMessage(err),ltBoth);//<------ Das hier wird ebenfalls ausgeführt mit Fehler:"Diese Sicherheitskennung kann nicht als Besitzer des Objekts zugeorndet werden" if not DestroyEnvironmentBlock(lenv)then snlogger.Log('EnvironmentBlock konnte nicht geschlossen werden'); if not UnloadUserProfile(ltoken,pi.hProfile)then snlogger.Log('UserProfile konnte nicht geschlossen werden'); if not CloseHandle(pri.hProcess)then snlogger.Log('hProcess konnte nicht geschlossen werden'); if not CloseHandle(pri.hThread)then snlogger.Log('hThread konnte nicht geschlossen werden'); if not CloseHandle(ltoken2)then snlogger.Log('ltoken2 konnte nicht geschlossen werden'); if not CloseHandle(ltoken) then snlogger.Log('ltoken konnte nicht geschlossen werden'); //snlogger.log(inttostr(GetLastError)); end else SNLogger.Log('Arbeitsumgebung konnte nicht erstellt werden. '+SysErrorMessage(GetLastError)); end else SNLogger.Log('Benutzerprofil konnte nicht geladen werden. '+SysErrorMessage(GetLastError)); end else SNLogger.Log('Duplicate nicht möglich. '+SysErrorMessage(GetLastError)); end else SNLogger.Log('Login nicht möglich. '+SysErrorMessage(GetLastError),ltBoth); except on e : exception do SNLogger.Log('Fehler beim Starten eines Prozesses:'+e.Message+slinebreak+SysErrorMessage(GetLastError),ltBoth); end; finally snlogger.log('CreateProcess:'+syserrormessage(getlasterror)); end; end; :angel: |
Re: Problem mit Sicherheitskennung bei CreateProcessAsUser
Also die Meldung kommt jetzt auch direkt nach einem Neustart des Rechners.
Seltsam ist, manchmal wird der Prozess ausgeführt und manchmal nicht. Die Meldung kommt aber immer. Ich verzweifel echt an dem Ding. Ich weis au garnich so ich suchen soll :wall: Fehlt meinem Dienst ne Berechtigung?(läuft als LocalSystem) Was sagt der Fehler "1307: Diese Sicherheitskennung kann nicht als Besitzer des Objekts zugeordnet werden" genau aus? |
Re: Problem mit Sicherheitskennung bei CreateProcessAsUser
Hallo,
gebe ich Diese Sicherheitskennung kann nicht als Besitzer des Objekts zugeordnet werden in Google ein, bekomme ich zumindestens ein paar Infos, die mir sagen, dass es auf jeden Fall mit den Rechten zu tun hat. Und mit Besitzer ist ja wohl der Prozess gemeint (?) Heiko |
Re: Problem mit Sicherheitskennung bei CreateProcessAsUser
Naja Treffer bekomm ich dort auch, aber keiner davon hilft mir weiter :(
Also wenn der Besitzer der Prozess, also der Dienst ist, ist das Objekt das Programm das ich satrten will? Dann scheint der Dienst irgendwie seine Rechte weitergeben zu wollen doer sowas? Mal schau bei welcher Funktion was derartiges gemacht wird.. Edit: Im Endeffekt wären entsprechende Flags das inherited Flag bei CreateEnvironmentBlock und das inherit Flag bei CreateProcessAsUser. beide hab ich schon getauscht un hilft nix.. |
Re: Problem mit Sicherheitskennung bei CreateProcessAsUser
Nur noch einen zusätzlichen Hinweis (unter D2005 mag es so ja noch gehn, aber
Code:
Wozu kopierst du eigentlich die Parameter nochmal?
LUser : [b]string[/b];
[b]PAnsiChar[/b](LUser) AUser LUser usw. Und weiter guck ich jetzt nicht, da ich nichts seh. Ich hasse ScrollBars und ein paar Leerzeichen könnten nicht schaden. |
Re: Problem mit Sicherheitskennung bei CreateProcessAsUser
Danke himitsu, ich hab das mit den Parametern jetz mal abgeändert :)
naja das Problem bleibt bestehen, ich hab in der Windows Verwaltung bei den Lokalen Sicherheitsrichtlinien jetzt einmal verschiedene Richtlinien für das Konto LOKALER DIENST aktiviert: Einsetzen als Teil des Bestriebssystems Verändern einer Objektbezeichnung Übernehmen des Besitzes von Dateien und Objekten Erstellen eines Tokenobjekts Erstellen globaler Objekte Ersetzen eines Tokens auf Prozessebene Alles Punkte die ich in verschiedenen Artikeln über das Thema CreateProcessAsUser aus nem Dienst heraus gelesen habe, aber nachwievor kommt die Meldung. Ich werd jetzt mal testen, ob der Benutzer unter dem ich den Prozess starte diese Richtlinien ebenfalls haben muss, aber denke nicht dass dies der Fall ist. Habt ihr sonst noch Tipps? Oder hab ich evtl irgendwas falsch verstanden bei den Richtlinien? |
Re: Problem mit Sicherheitskennung bei CreateProcessAsUser
Das Problem liegt imho an dieser Zeile:
Delphi-Quellcode:
Du duplizierst damit das Token von LogonUser, was eigentlich garnicht nötig wäre.
sil := SecurityIdentification;
Das neue Token verwendet dann dieses Personifizierungslevel, was verhindert, dass CPAU das Token einem neuen Prozess zuordnen kann. Man kann mit dieser Stufe nämlich nur (mehr oder weniger) lesend auf das Token zugreifen. Siehe dazu: ![]() Also versuch mal SecurityImpersonation oder benutze gleich das "original" Token von Logonuser ohne DuplicateToken. |
Re: Problem mit Sicherheitskennung bei CreateProcessAsUser
Ich hab die Variable sil jetz mal komplett rausgemacht(Deklaration auskommentiert) und DuplicateTokenEx direkt einmal SecurityImpersonation und einmal SecurityIdentification übergeben, aber bei beiden Versuchen kam dann trotzdem noch der Fehler.
Das DuplicateTokenEx hab ich ursprünglich verwendet um ein Primary Token zu bekommen, was ich aber glaube jetzt nichtmehr brauche, da ich das NETWORK Flag bei LogonUser nichtmehr verwende. Aber auch ohne dem DuplicateTokenEx kommt die Meldung, das ltoken2 hab ich ebenfalls komplett rausgemacht, ist also nicht ausversehen noch irgendwo drin. |
Re: Problem mit Sicherheitskennung bei CreateProcessAsUser
Versuch mal einen anderen Benutzer anzumelden.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz