Seite 1 von 3

PC herunterfahren

Verfasst: 03.11.2006 21:37
von Thomas
Hallo,
weiß jemand einen Befehl, mit dem man den PC runterfahren kann? :|

Verfasst: 03.11.2006 21:47
von Fluid Byte

Code: Alles auswählen

Procedure ExitWindows(Flags.l) 
   Protected tkp.TOKEN_PRIVILEGES 
   Protected tkpNewButIgnored.TOKEN_PRIVILEGES
       
   OpenProcessToken_(GetCurrentProcess_(),#TOKEN_ADJUST_PRIVILEGES | #TOKEN_QUERY,@hdlTokenHandle) 

   ; Get the LUID for shutdown privilege. 
   LookupPrivilegeValue_(0,"SeShutdownPrivilege",tkp\Privileges\Luid) 

   tkp\PrivilegeCount = 1    ; One privilege to set 
   tkp\Privileges\Attributes = #SE_PRIVILEGE_ENABLED   
    
   ; Enable the shutdown privilege in the access token of this process. 
   AdjustTokenPrivileges_(hdlTokenHandle,0,tkp,0,0,0) 
   
   ExitWindowsEx_(Flags,0)
EndProcedure 

ExitWindows(#EWX_SHUTDOWN)

Verfasst: 03.11.2006 22:33
von RSBasic
@Fluid Byte
Warum so schwer?
Einfacher mit diesem Befehl:

Code: Alles auswählen

RunProgram("C:\Windows\System32\shutdown.exe","-s -t 0 -f","",0)
Für PB 3.30:

Code: Alles auswählen

RunProgram("C:\Windows\System32\shutdown.exe","-s -t 0 -f",0)

Verfasst: 03.11.2006 22:35
von Leonhard
RSBasic hat geschrieben:@Fluid Byte
Warum so schwer?
Einfacher mit diesem Befehl:

Code: Alles auswählen

RunProgram("C:\Windows\System32\shutdown.exe","-s -t 0 -f","",0)
Für PB 3.30:

Code: Alles auswählen

RunProgram("C:\Windows\System32\shutdown.exe","-s -t 0 -f",0)
Dies ist nur bei WinXP oder anderen NT-Versionen vorhanden. Win98 geht da nicht mit. Da funzt das mit der rundll.

Verfasst: 03.11.2006 22:41
von ts-soft
Die Version von Fluid Byte ist die einzige, die auf jedem Windows-System
funktioniert. Bei allen anderen muß man vorher die Windows-Version
auswerten usw. Ist also nicht umständlich, sondern die sinnvollste Variante.

Verfasst: 04.11.2006 00:18
von winduff
Eine Suche mit den Begriffen wie Shutdown; Shutdown.exe; Herunterfahren (o.Ä) hätte dir sehr schnell weitergeholfen.

Habe ich neulich auch kurz gebraucht, hatte das von Fluid im Nu gefunden.

Verfasst: 04.11.2006 11:34
von RSBasic
@Leonhard & @ts-soft
Achso, habe nicht gewusst.

Verfasst: 05.11.2006 17:42
von Joel
Also bei Windows 98 geht dass so:

Code: Alles auswählen

ExitWindowsEx_((#EWX_LOGOFF), 0)
Und bei zb. Win. XP musst du dass vorher aufrufen:

Code: Alles auswählen

Procedure Privilegien()
#EWX_LOGOFF = 0 
#EWX_SHUTDOWN = 1 
#EWX_REBOOT = 2 
#EWX_FORCE = 4 
#EWX_POWEROFF = 8 
#TOKEN_ADJUST_PRIVILEGES = 32    
#TOKEN_QUERY = 8                
#SE_PRIVILEGE_ENABLED = 2      
#ANYSIZE_ARRAY = 1 
#VER_PLATFORM_WIN32_NT = 2 
#SE_SHUTDOWN_NAME = "SeShutdownPrivilege" 

Structure MyLUID 
LowPart.l 
HighPart.l 
Attributes.l 
EndStructure 

Structure MyTOKEN 
PrivilegeCount.l 
LowPart.l 
HighPart.l 
Attributes.l 
EndStructure 

Global hdlProcessHandle.l 
Global hdlTokenHandle.l 
Global tmpLuid.MyLUID 
Global tkp.MyToken 
Global tkpNewButIgnored.MyToken 
Global lBufferNeeded.l 

hdlProcessHandle = GetCurrentProcess_() 

OpenProcessToken_(hdlProcessHandle, #TOKEN_ADJUST_PRIVILEGES | #TOKEN_QUERY, @hdlTokenHandle) 

; Get the LUID for shutdown privilege 
SysName.s = "" + Chr(0) 
Name.s = "SeShutdownPrivilege" + Chr(0) 
Erg.l = LookupPrivilegeValue_(SysName, Name, @tmpLuid) 

tmpLuid\Attributes = #SE_PRIVILEGE_ENABLED 
tkp\PrivilegeCount = 1 
tkp\LowPart = tmpLuid\LowPart 
tkp\HighPart = tmpLuid\HighPart 
tkp\Attributes = tmpLuid\Attributes 

; Enable the shutdown privilege in the access token of this process 
Erg.l = AdjustTokenPrivileges_(hdlTokenHandle, 0, @tkp, SizeOf(MyTOKEN), @tkpNewButIgnored, @lblBufferNeeded) 
EndProcedure 

Und dann kannst du in ExitWindows_Ex_() dass unten alles einsetzen:

Code: Alles auswählen

#EWX_LOGOFF = 0 
#EWX_SHUTDOWN = 1 
#EWX_REBOOT = 2 
#EWX_FORCE = 4 
#EWX_POWEROFF = 8

Verfasst: 05.11.2006 17:52
von Thomas
ok, danke! :D
ich hoffe das reicht für's erste.

Verfasst: 05.11.2006 17:55
von ts-soft
@Joel
Ist dasselbe wie von FluidByte, sowie von mir schon mehrfach gepostet. Nur
umständlicher, da in PB bereits vordefinierte Strukturen nochmals unter
anderem Namen definiert werden. Also einfach nur veralteter Code nach PB4
übersetzt :mrgreen:

Die Rechte zum herunterfahren, die unter NT Systemen notwendig sind, kann
man auch unter Win9x anfordern, auch wenn nicht gebraucht, so brauch man
keine 2 Sourcen :wink:

PS: die globalen Variablen machen auch keinen Sinn