locked
Fehler bei CreateProcessAsUser, 1307: Diese Sicherheitskennung kann nicht als Besitzer des Objekts zugeordnet werden

    Frage

  • Guten Tag.

    Ich stoße aus einem Dienst heraus einen externen Prozess an.
    Der Dienst selbst läuft als Local System.
    Die Prozesse die gestartet werden, werden unter beliebigen Benutzerkonten gestartet.
    Das problem tritt bisher unter Windows XP udn Vista auf(andere noch nciht getestet)
    Hier mal der Code:
    try
      LUser:=AUser;
      LPassword:=APassword;
      LDomain:=ADomain;
      LProgram:=AProgram;
      try
      FillChar(sil,SizeOf(TSecurityImpersonationLevel),#0);
      sil := SecurityImpersonation;
      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,
            false   //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,//false
                CREATE_UNICODE_ENVIRONMENT or CREATE_NEW_PROCESS_GROUP or NORMAL_PRIORITY_CLASS or CREATE_NO_WINDOW,   
                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);
            err:=GetlastError;
            if err<>0 then SNLogger.Log('Prozess konnte nicht gestartet werden. Fehler '+IntToStr(err)+':'+SysErrorMessage(err),ltBoth);
            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;
    Das ist Delphicode. Das Problem ist nun der CreateProcessAsUser Befehl.
    Es gibt folgende Möglichkeiten was passiert:
    1) CreateProcessAsUser liefert true , der Prozess wird gestartet und es erscheint auch keine Fehlermeldung
    2) CreateProcessAsUser liefert true , der Prozess wird gestartet und es erscheint die Fehlermeldung 1307
    3) CreateProcessAsUser liefert true , der Prozess wird _nicht_ gestartet und es erscheint die Fehlermeldung 1307
    Fehler 1307: Diese Sicherheitskennung kann nicht als Besitzer des Objekts zugeordnet werden

    In der momentanen Version des Codes treten nur Möglichkeit 2 und 3 ein.

    Ich habe schon jede Menge gegoogelt, aber ich kann nicht rausfinden was genau diesen Fehler verursacht.
    Das problem ist eigentlich, dass der Prozess manchmal nicht gestartet wird, was sehr kritisch sit, da es ein Backupprozess ist der automatisiert ein Backup machen soll.
    Ich hoffe hier kann mir jemand helfen, da ich in der Vergangenheit schon gute Tipps bekommen habe!
    Freitag, 6. November 2009 11:56

Antworten

Alle Antworten