Gå til innhold

Shutdown, Restart, Logg off


Anbefalte innlegg

Videoannonse
Annonse

Dessverre fungerer ikke shutdown på eldre Windows versjoner som Win95, Win98, Win98 SE og ME. Derfor anbefaler jeg deg å heller satse på API-calls. Selv om det kan føre til mer kode, vil det gjøre applikasjonen din mer fleksibel, ettersom den også kan kjøres på eldre operativsystemer.

 

ExitWindowsEx, som er API-kallet vi skal bruke, krever et spesielt privilegiet på NT, 2000 og XP. Som standard er denne avskrudd for alle programmer, men vi kan lett sette den på igjen.

 

Sett følgende kode i en modul eller form:

 

Option Explicit

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
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO) As Long

Private Const EWX_LOGOFF = 0
Private Const EWX_SHUTDOWN = 1
Private Const EWX_REBOOT = 2
Private Const EWX_FORCE = 4
Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const TOKEN_QUERY = &H8
Private Const SE_PRIVILEGE_ENABLED = &H2
Private Const ANYSIZE_ARRAY = 1
Private Const VER_PLATFORM_WIN32_NT = 2

Private Type OSVERSIONINFO
   dwOSVersionInfoSize As Long
   dwMajorVersion As Long
   dwMinorVersion As Long
   dwBuildNumber As Long
   dwPlatformId As Long
   szCSDVersion As String * 128
End Type

Private Type LUID
   LowPart As Long
   HighPart As Long
End Type

Private Type LUID_AND_ATTRIBUTES
   pLuid As LUID
   Attributes As Long
End Type

Private Type TOKEN_PRIVILEGES
   PrivilegeCount As Long
   Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type

'Detect if the program is running under Windows NT
Public Function IsWinNT() As Boolean
   Dim myOS As OSVERSIONINFO
   myOS.dwOSVersionInfoSize = Len(myOS)
   GetVersionEx myOS
   IsWinNT = (myOS.dwPlatformId = VER_PLATFORM_WIN32_NT)
End Function

'set the shut down privilege for the current application
Private Sub EnableShutDown()

   Dim hProc As Long
   Dim hToken As Long
   Dim mLUID As LUID
   Dim mPriv As TOKEN_PRIVILEGES
   Dim mNewPriv As TOKEN_PRIVILEGES
   
   hProc = GetCurrentProcess()
   OpenProcessToken hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken
   LookupPrivilegeValue "", "SeShutdownPrivilege", mLUID
   
   mPriv.PrivilegeCount = 1
   mPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
   mPriv.Privileges(0).pLuid = mLUID
   
   ' enable shutdown privilege for the current application
   AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount)

End Sub

' Shut Down NT
Public Sub ShutDownNT(Force As Boolean)

   Dim ret As Long, Flags As Long
   Flags = EWX_SHUTDOWN + IIf(Force, EWX_FORCE, 0)
   
   If IsWinNT Then
       EnableShutDown
   End If
   
   ExitWindowsEx Flags, 0
   
End Sub

'Restart NT
Public Sub RebootNT(Force As Boolean)

   Dim ret As Long, Flags As Long
   
   Flags = EWX_REBOOT + IIf(Force, EWX_FORCE, 0)
   
   If IsWinNT Then
       EnableShutDown
   End If
   
   ExitWindowsEx Flags, 0
   
End Sub

'Log off the current user
Public Sub LogOffNT(Force As Boolean)

   Dim ret As Long, Flags As Long
   
   Flags = EWX_LOGOFF + IIf(Force, EWX_FORCE, 0)
   ExitWindowsEx Flags, 0
   
End Sub

 

Nå kan du enkelt skru av datamaskinen med følgende kode:

 

ShutDownNT True ' Avslutter alle programmer og skrur av Windows
RebootNT True ' Restarter Windows
LogOffNT True ' Logger av gjeldende bruker

Endret av aadnk
Lenke til kommentar
  • 3 uker senere...
kan jeg skrive: shell "shutdown" -m \\"maskinnavn" -s ?

 

du vil slå av maskinen du velger på nettverke?!??!!

Vel, du må ha privilegier til å avslutte en annen datamaskin på nettverket. Men har destinasjons-datamaskinen firewall påskrudd med blokkering av NetBIOS portene, vil kommandoen IKKE fungere. I tillegg må være domene-administrator; pålogget som administrator kun på den lokale datamaskinen vil heller ikke fungere.

 

Dessuten skal koden skrives slik:

 

shell "shutdown -m \\[maskinnavn] -s"

 

Nei, for å skru av en datamaskin i nettverket er du nesten tvunget til å bruke disse verktøyene istedenfor.

 

http://www.snapfiles.com/get/remshutdownpro.html

http://www.freewareweb.com/cgi-bin/archive.cgi?ID=1532

http://gethelp.devx.com/techtips/nt_pro/10...minNT0102-3.asp

http://www.emco.is/

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...