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;