InitiateSystemShutdown_()

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
orange-blue
Beiträge: 556
Registriert: 04.09.2004 22:23
Kontaktdaten:

InitiateSystemShutdown_()

Beitrag von orange-blue »

Der 1. Parameter dieser WinApi-Funktion übergibt die maschine die heruntergefahren werden soll. Wenn ich Null übergebe dann sollte der lokale PC heruntergefahren werden. Leider funzt das aber nicht. ich bekomm immer 0 zurück.
Weis jemand woran das liegen könnte?
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Beitrag von dige »

Lies mal die Remarks in der Win32.hlp
To shut down the local computer, the calling process must have the SE_SHUTDOWN_NAME privilege. ..
Unter NT-Systemen muss man sich erstmal die Rechte holen,
im Code-Archiv gibt es sicher ein Beispiel ...

cya dige
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Unter NT-Systemen muss man sich erstmal die Rechte holen
das stimmt
To shut down the local computer, the calling thread must have the SE_SHUTDOWN_NAME privilege. To shut down a remote computer, the calling thread must have the SE_REMOTE_SHUTDOWN_NAME privilege on the remote computer. By default, users can enable the SE_SHUTDOWN_NAME privilege on the computer they are logged onto, and administrators can enable the SE_REMOTE_SHUTDOWN_NAME privilege on remote computers
hier der Code für den lokalen Computer

Code: Alles auswählen

Procedure EnableShutDown()
  Privileges.TOKEN_PRIVILEGES
  OpenProcessToken_(GetCurrentProcess_(), 40, @hToken)
  Privileges\PrivilegeCount           = 1
  Privileges\Privileges[0]\Attributes = #SE_PRIVILEGE_ENABLED
  LookupPrivilegeValue_(0, "SeShutdownPrivilege", @Privileges\Privileges[0]\Luid)
  AdjustTokenPrivileges_(hToken, 0, @Privileges, 0, 0, 0)
  CloseHandle_(hToken)
EndProcedure
damit sollte es funktionieren
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
orange-blue
Beiträge: 556
Registriert: 04.09.2004 22:23
Kontaktdaten:

Beitrag von orange-blue »

Aber muss dass Programm die rechte haben oder der Benutzter der das programm gestartet hat?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

orange-blue hat geschrieben:Aber muss dass Programm die rechte haben oder der Benutzter der das programm gestartet hat?

Code: Alles auswählen

EnableShutDown()
rufste auf, dann hat Dein Programm das Recht, den lokalen Computer runterzufahren. Der Benutzer des Programms muß lediglich angemeldet sein. Was wohl fast immer der Fall ist :mrgreen:
Im PureArea.net im Showcase findest Du mein Programm "TS-Shutdown" mit Source, das kannste Dir ja mal anschauen.

gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
orange-blue
Beiträge: 556
Registriert: 04.09.2004 22:23
Kontaktdaten:

Beitrag von orange-blue »

Jo werd ich machen. danke
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Ich benutze immer den folgenden Code, wenn mein PC zu einer bestimmten Zeit herunterfahren soll.

Code: Alles auswählen

Procedure Shutdown()
  #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) 
  Erg.l = ExitWindowsEx_((#EWX_POWEROFF | #EWX_FORCE), 0) 
EndProcedure

hour.l = 22
minute.l = 00

Repeat
  time.l = Date()
  If Hour(time) = hour And Minute(time) = minute
    Shutdown()
    Break
  ElseIf Hour(time) = hour And Minute(time) > minute
    MessageRequester("ShutDownSystemByGivenTime", "Programm vorzeitig beendet")
    Break
  EndIf
  Delay(1000)
ForEver
Nachteil: Zum Beenden des Programms muss man den TaskManager benutzen. :wink:
Benutzeravatar
bingo
Beiträge: 118
Registriert: 16.09.2004 18:33
Wohnort: thüringen
Kontaktdaten:

Beitrag von bingo »

oder man nimmt einfach "shutdown.exe" aus dem system32-ordner ... :wink:

(man muss ja nicht immer und alles neu erfinden , wenn das tool doch auf jedem xp-pc liegt ...)
1:0>1
orange-blue
Beiträge: 556
Registriert: 04.09.2004 22:23
Kontaktdaten:

Beitrag von orange-blue »

ich will ja nicht nur runterfahren nach einer bestimmten zeit.
Ich will auch standby, ruhezustand, PC sperren, abmelden und dass alles auch über shortcuts(zb. [alt]+[s] für sperren) aber global(also auch wenn ich das programm nicht offen hab.
Es hat eben nur diese funktion nicht gefunzt, aber jetzt ist mein Programm (theoretisch) fertig :D
walker
Beiträge: 278
Registriert: 29.08.2004 18:39
Wohnort: Bayern

Beitrag von walker »

bingo hat geschrieben:oder man nimmt einfach "shutdown.exe" aus dem system32-ordner ... :wink:

(man muss ja nicht immer und alles neu erfinden , wenn das tool doch auf jedem xp-pc liegt ...)
Gibt's nur auf XP-rechnern....(W2K könnte auch sein) aber nicht auf Win9x/ME ...

cu
Antworten