Einzelnen Beitrag anzeigen

boeseboese

Registriert seit: 23. Nov 2015
8 Beiträge
 
#1

WinShutdown per Aufgabenplanung

  Alt 27. Nov 2015, 08:17
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²
  Mit Zitat antworten Zitat