Seite 1 von 1

InitiateSystemShutdown_()

Verfasst: 01.02.2005 22:50
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?

Verfasst: 02.02.2005 10:06
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

Verfasst: 02.02.2005 10:31
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

Verfasst: 02.02.2005 12:38
von orange-blue
Aber muss dass Programm die rechte haben oder der Benutzter der das programm gestartet hat?

Verfasst: 02.02.2005 12:46
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

Verfasst: 02.02.2005 18:27
von orange-blue
Jo werd ich machen. danke

Verfasst: 02.02.2005 18:37
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:

Verfasst: 02.02.2005 18:57
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 ...)

Verfasst: 02.02.2005 19:36
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

Verfasst: 03.02.2005 11:59
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