Schönen guten Morgen,
ich hoffe, dass ihr mir evtl. weiterhelfen könnt.
Derzeit nutze ich folgendes Programm um Windows herunterzufahren und dabei die Updates zu installieren:
Delphi-Quellcode:
function WindowsShutDown(Computer: PChar; Msg: PChar; Time: Word; Force: Boolean; Reboot: Boolean): Boolean;
var
rl: Cardinal;
hToken: Cardinal;
tkp: TOKEN_PRIVILEGES;
flags: DWORD;
begin
Result:=False;
if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
RaiseLastOSError
else
begin
if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then
begin
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
tkp.PrivilegeCount := 1;
AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
if GetLastError <> ERROR_SUCCESS then
RaiseLastOSError
else
begin
if Win32MajorVersion >= 6 then
begin
//Flags
if Reboot then
flags := SHUTDOWN_FORCE_SELF or SHUTDOWN_GRACE_OVERRIDE or SHUTDOWN_RESTART
else
flags := SHUTDOWN_FORCE_SELF or SHUTDOWN_GRACE_OVERRIDE or SHUTDOWN_INSTALL_UPDATES;
//Befehl ausführen
if InitiateShutdown(Computer, Msg, Time, flags, 0) = ERROR_SUCCESS then
result := True
else
RaiseLastOSError;
end
else
begin
if InitiateSystemShutdown(Computer, Msg, Time, Force, Reboot) then
result := True
else
RaiseLastOSError;
end;{else}
end;{else}
end
else
RaiseLastOSError;
end;{else}
end;
Das funktioniert so lange bis ich die Aufgabe als Task "unabhängig von der Benutzeranmeldung" ausführen lasse. Hierbei ist es egal, ob ich SYSTEM nehme oder einen personalisierten Benutzer.
Ich sehe den Zusammenhang mit der Privilege-Abfrage. Es stellt sich die Frage, ob es dafür der richtige Ansatz ist und ob ich diese Abfrage überhaupt benötige. Evtl. wäre auch der Einsatz von ImpersonateLoggedOnUser möglich?
Ich hoffe, dass ihr mir hier ein wenig unter die Arme greifen könnt.
Ziel ist es einen Pool von virtuellen Maschinen per Aufgabenplanung zeitgesteuert das Programm ausführen zu lassen.
Danke und Gruß
boese²