Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Klatsch und Tratsch (https://www.delphipraxis.net/34-klatsch-und-tratsch/)
-   -   Shutdown nach Ende der Programmausführung (https://www.delphipraxis.net/161478-shutdown-nach-ende-der-programmausfuehrung.html)

mschaefer 5. Jul 2011 13:34

Shutdown nach Ende der Programmausführung
 
Vieleicht gibt es etwas fertiges: Suche ein Tool das einen Rechner nach einer gewissen Zeit herunterfährt, wenn Virtualbox beendet wurde, also das Gastsystem heruntergefahren ist. Hat da jemand eine Idee?

DeddyH 5. Jul 2011 13:37

AW: Shutdown nach Ende der Programmausführung
 
Ginge das nicht per Batch-Datei?
Code:
start /wait VirtualBox (Parameter)
shutdown /s

Luckie 5. Jul 2011 13:42

AW: Shutdown nach Ende der Programmausführung
 
Das funktioniert aber nur als Administrator. Mit eingeschränkten Benutzerrechten hat man nicht die Möglichkeit shutdown.exe auszuführen.

Aber ein Konsolenprogramm welches den Rechner runterfährt mittels ExitWindowsEx ist ja schnell geschrieben.

mschaefer 5. Jul 2011 13:48

AW: Shutdown nach Ende der Programmausführung
 
Sag mal, das gilt aber dann auch für ein Delphiprogramm, das den Shutdown ausführen soll ?

Luckie 5. Jul 2011 13:51

AW: Shutdown nach Ende der Programmausführung
 
Wenn es die Shutdown.exe aufruft und auch mit eingeschränkten Benutzerrechten gestartet wurde dann ja. Aber eine Lösung habe ich dir ja genannt.

mleyen 5. Jul 2011 14:20

AW: Shutdown nach Ende der Programmausführung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab da auch noch was, einfach den Prozessnamen oder die PID als Parameter übergeben:

Delphi-Quellcode:
program ShutDownOnProcessClosed;

uses
  Windows, TlHelp32;

function ShutdownWindows: Boolean;
const
  cSE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
var
  OSVersionInfo: TOSVersionInfo;
  hToken: THandle;
  hProcess: THandle;
  TokenPriv: TTokenPrivileges;
  ReturnLength: DWORD;
begin
  Result := False;
  OSVersionInfo.dwOSVersionInfoSize := SizeOf (OSVersionInfo);
  if not GetVersionEx(OSVersionInfo) then
    Exit;
  if OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then
  begin
    hProcess := GetCurrentProcess;
    if not OpenProcessToken (hProcess, TOKEN_ADJUST_PRIVILEGES, hToken) then
      Exit;
    if not LookupPrivilegeValue (nil, cSE_SHUTDOWN_NAME, TokenPriv.Privileges[0].Luid) then
      Exit;
    TokenPriv.PrivilegeCount := 1;
    TokenPriv.Privileges [0].Attributes := SE_PRIVILEGE_ENABLED;
    if not AdjustTokenPrivileges (
        hToken, False, TokenPriv, 0, PTokenPrivileges (nil)^, ReturnLength)
    then
      Exit;
    CloseHandle (hToken);
  end;
  Result := ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF, $FFFFFFFF);
end;

function LowerCase(const Value: string): string;
var
  Ch   : Char;
  L    : Integer;
  Source: PChar;
  Dest : PChar;
begin
  L := Length(Value);
  SetLength(Result, L);
  Source := Pointer(Value);
  Dest := Pointer(Result);
  while L <> 0 do
  begin
    Ch := Source^;
    if (Ch >= 'A') and (Ch <= 'Z') then
      Inc(Ch, 32);
    Dest^ := Ch;
    Inc(Source);
    Inc(Dest);
    Dec(L);
  end;
end;

function getProcessID(const Exename: string): Cardinal;
var
  hProcSnap: THandle;
  ProcEntry: TProcessEntry32;
begin
  Result := 0;
  hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
  if hProcSnap <> INVALID_HANDLE_VALUE then
  begin
    ProcEntry.dwSize := SizeOf(ProcessEntry32);
    if Process32First(hProcSnap, ProcEntry) = true then
      while Process32Next(hProcSnap, ProcEntry) = true do
        if LowerCase(Exename) = LowerCase(ProcEntry.szExeFile) then
        begin
          Result := ProcEntry.th32ProcessID;
          Break;
        end;
    CloseHandle(hProcSnap);
  end;
end;

function ProcessExist(const PID: Cardinal): Boolean;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  Result := False;
  while Integer(ContinueLoop) <> 0 do
  begin
    if FProcessEntry32.th32ProcessID = PID then
    begin
      Result := True;
      Break;
    end;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

function CharToUInt(const AChar: Char): Cardinal; {$IFDEF Inln}inline;{$ENDIF}
begin
  Result := Ord(AChar)-ord('0');
end;

function TryCharToUInt(const AChar: Char; out AInt: Cardinal): Boolean; {$IFDEF Inln}inline;{$ENDIF}
begin
  AInt := CharToUInt(AChar);
  Result := AInt <= 9;
end;

function TryStrToUInt(const AStr: string; out AUInt: Cardinal): Boolean; {$IFDEF Inln}inline;{$ENDIF}
var
  i, tmp: Cardinal;
begin
  for i := 1 to Length(AStr) do
  begin
    if TryCharToUInt(AStr[i], tmp) then
      AUInt := AUInt * 10 + tmp
    else
    begin
      Result := false;
      Exit;
    end;
  end;
  Result := AStr <> '';
end;

var
  PID: Cardinal;
begin
  if ParamCount <> 1 then
    Exit;

  if not TryStrToUInt(ParamStr(1), PID) then
    PID := getProcessID(ParamStr(1));

  if PID <> 0 then
    while ProcessExist(PID) do
      Sleep(100);

  ShutdownWindows;
end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:42 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