At lukke computeren

Tags:    visual-basic

Er det mulig at lukke en computer fra et vb-program, og i tilfælde af ja, hvordan (f.eks. ved tryk på en knap) ?



7 svar postet i denne tråd vises herunder
4 indlæg har modtaget i alt 5 karma
Sorter efter stemmer Sorter efter dato
Er det mulig at lukke en computer fra et vb-program, og i tilfælde af ja, hvordan (f.eks. ved tryk på en knap) ?

For at det virker under WinXP/NT/2000 skal der mere til

Private Type LUID
UsedPart As Long
IgnoredForNowHigh32BitPart As Long
End Type

Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
TheLuid As LUID
Attributes As Long
End Type

Private Const EWX_LOGOFF = 0
Private Const EWX_SHUTDOWN = 1
Private Const EWX_REBOOT = 2
Private Const EWX_FORCE = 4
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Private Declare Function GetLastError Lib "kernel32" () As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long

Public Function ReBoot(ByVal Action As String) As Long
'--- Reboot the computer ---
Call AdjustToken
Dim Flags As Long
Select Case UCase(Action)
Case "/REBOOT"
Flags = EWX_REBOOT
Case "/SHUTDOWN"
Flags = EWX_SHUTDOWN
Case "/LOGOFF"
Flags = EWX_LOGOFF
Case Else
Flags = EWX_REBOOT + EWX_FORCE
End Select
X = ExitWindowsEx(Flags, 0)
If X <> 1 Then
X = GetLastError()
ReBoot = X
Else
ReBoot = 0
End If
End Function

Private Sub AdjustToken()
Const TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8
Const SE_PRIVILEGE_ENABLED = &H2
Dim hdlProcessHandle As Long
Dim hdlTokenHandle As Long
Dim tmpLuid As LUID
Dim tkp As TOKEN_PRIVILEGES
Dim tkpNewButIgnored As TOKEN_PRIVILEGES
Dim lBufferNeeded As Long

hdlProcessHandle = GetCurrentProcess()
Call OpenProcessToken(hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hdlTokenHandle)

'--- Get the LUID for shutdown privilege ---
Call LookupPrivilegeValue("", "SeShutdownPrivilege", tmpLuid)

tkp.PrivilegeCount = 1 ' One privilege to set
tkp.TheLuid = tmpLuid
tkp.Attributes = SE_PRIVILEGE_ENABLED

'--- Enable the shutdown privilege in the access token of this process ---
Call AdjustTokenPrivileges(hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded)
End Sub





Prøv noget i retning af det her:

<pre>
Sub ShutDown()
Dim OpSysSet, OpSys

OpSysSet = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}").ExecQuery("select * from Win32_OperatingSystem where Primary=true")
For Each OpSys In OpSysSet
OpSys.ShutDown()
Next
End Sub

</pre>

Jeg garanterer ikke det virker under XP, men det kan du jo selv teste. Jeg mener at kunne huske at det er nødvendigt først at sætte diverse rettigheder.

Læs mere på msdn.microsoft.com/library under setup and system administration->windows management instrumentation.


Mvh.,

Jakob Justsen



Det skal gerne kunne gøres under alle windows-platforme...

Jeg ved ikke lige om det er noget, men man kan altid lukke eller genstarte sin computer ved at bruge programmet shutdown.exe som vistnok ligger som default i alle windows versioner (i hvert fald XP). Det må da være muligt at aktivere dette program i VB...
Husk at shutdown.exe skal have en efterfølgende -X parameter som du skal angive afhængigt af om du vil slukke computeren, sætte den i dvale o.sv...




Er det mulig at lukke en computer fra et vb-program, og i tilfælde af ja, hvordan (f.eks. ved tryk på en knap) ?


Til et modul:
Public Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, _
ByVal dwReserved As Long) As Long
Public Const EWX_FORCE = 4 'Tving nedlukning
Public Const EWX_LOGOFF = 0 'log af
Public Const EWX_REBOOT = 2 'genstart
Public Const EWX_SHUTDOWN = 1 ''luk ned
Public Const EWX_POWEROFF = 8 ''sluk

Kode til din knap:
ExitWindowsEx(EWX_FORCE or EWX_REBOOT, 0)
For at tvinge et genstart



Mvh,

Thomas Nielsen



Er det mulig at lukke en computer fra et vb-program, og i tilfælde af ja, hvordan (f.eks. ved tryk på en knap) ?


Skal det kunne gøres under Windows XP???

I Am The Cyborg



Det skal gerne kunne gøres under alle windows-platforme...



Er det mulig at lukke en computer fra et vb-program, og i tilfælde af ja, hvordan (f.eks. ved tryk på en knap) ?


Prøv dette her:

Shell ""rundll32.exe" "user.exe,exitwindows""


Jeg VED ikke om det virker, men prøv...



t