AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Problem mit Sicherheitskennung bei CreateProcessAsUser
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Sicherheitskennung bei CreateProcessAsUser

Ein Thema von Angel4585 · begonnen am 5. Nov 2009 · letzter Beitrag vom 17. Nov 2009
Antwort Antwort
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#1

Problem mit Sicherheitskennung bei CreateProcessAsUser

  Alt 5. Nov 2009, 10:08
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:
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;
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.

Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Problem mit Sicherheitskennung bei CreateProcessAsUser

  Alt 6. Nov 2009, 08:03
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
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?
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Problem mit Sicherheitskennung bei CreateProcessAsUser

  Alt 6. Nov 2009, 08:17
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
Heiko
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Problem mit Sicherheitskennung bei CreateProcessAsUser

  Alt 6. Nov 2009, 08:23
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..
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.048 Beiträge
 
Delphi 12 Athens
 
#5

Re: Problem mit Sicherheitskennung bei CreateProcessAsUser

  Alt 6. Nov 2009, 09:42
Nur noch einen zusätzlichen Hinweis (unter D2005 mag es so ja noch gehn, aber

Code:
LUser : [b]string[/b];
[b]PAnsiChar[/b](LUser)
Wozu kopierst du eigentlich die Parameter nochmal?
AUser LUser
usw.

Und weiter guck ich jetzt nicht, da ich nichts seh.
Ich hasse ScrollBars und ein paar Leerzeichen könnten nicht schaden.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Problem mit Sicherheitskennung bei CreateProcessAsUser

  Alt 16. Nov 2009, 10:54
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?
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#7

Re: Problem mit Sicherheitskennung bei CreateProcessAsUser

  Alt 16. Nov 2009, 15:09
Das Problem liegt imho an dieser Zeile:

sil := SecurityIdentification; Du duplizierst damit das Token von LogonUser, was eigentlich garnicht nötig wäre.
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: http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx

Also versuch mal SecurityImpersonation oder benutze gleich das "original" Token von Logonuser ohne DuplicateToken.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Problem mit Sicherheitskennung bei CreateProcessAsUser

  Alt 17. Nov 2009, 09:23
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.
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#9

Re: Problem mit Sicherheitskennung bei CreateProcessAsUser

  Alt 17. Nov 2009, 11:24
Versuch mal einen anderen Benutzer anzumelden.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz