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?
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
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.

Verfasst: 02.02.2005 18:57
von bingo
oder man nimmt einfach "shutdown.exe" aus dem system32-ordner ...
(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

Verfasst: 03.02.2005 11:59
von walker
bingo hat geschrieben:oder man nimmt einfach "shutdown.exe" aus dem system32-ordner ...
(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