InitiateSystemShutdown_()
- 
				orange-blue
- Beiträge: 556
- Registriert: 04.09.2004 22:23
- Kontaktdaten:
InitiateSystemShutdown_()
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?
			
			
									
									
						Weis jemand woran das liegen könnte?
- 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
das stimmtUnter NT-Systemen muss man sich erstmal die Rechte holen
hier der Code für den lokalen ComputerTo 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
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)
EndProcedurePureBasic 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.

						Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- 
				orange-blue
- Beiträge: 556
- Registriert: 04.09.2004 22:23
- Kontaktdaten:
- 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
orange-blue hat geschrieben:Aber muss dass Programm die rechte haben oder der Benutzter der das programm gestartet hat?
Code: Alles auswählen
EnableShutDown() 
 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.

						Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- 
				orange-blue
- Beiträge: 556
- Registriert: 04.09.2004 22:23
- Kontaktdaten:
- NicTheQuick
- Ein Admin
- Beiträge: 8812
- 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
Ich benutze immer den folgenden Code, wenn mein PC zu einer bestimmten Zeit herunterfahren soll.Nachteil: Zum Beenden des Programms muss man den TaskManager benutzen. 
			
			
									
									
						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
- 
				orange-blue
- Beiträge: 556
- Registriert: 04.09.2004 22:23
- Kontaktdaten:
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
			
			
									
									
						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




