• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    強制一個本地或遠程NT系統關閉

    發布: 2007-7-14 20:28 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 16次 | 進入軟件測試論壇討論

    領測軟件測試網   在Windows NT下,你能強制本地或遠程機器定時關閉。這段代碼將告訴你怎么做。你能指定系統關閉前的等待時間(0代表立即關閉),關閉進程的優先級(決定是否允許保存未完成的工作)和機器是否要重新啟動。
      開始一個新的Project,加入一個module,然后加入一下代碼:

    '判斷系統是否為NT:
    Private Type OSVERSIONINFO
      dwOSVersionInfoSize As Long
      dwMajorVersion As Long
      dwMinorVersion As Long
      dwBuildNumber As Long
      dwPlatformId As Long
      szCSDVersion As String * 128 ' Maintenance string for PSS usage
    End Type  
    Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
    Private Const VER_PLATFORM_WIN32_NT = 2
    Private Const VER_PLATFORM_WIN32_WINDOWS = 1
    Private Const VER_PLATFORM_WIN32s = 0

    '報告API錯誤:
    Private Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100
    Private Const FORMAT_MESSAGE_ARGUMENT_ARRAY = &H2000
    Private Const FORMAT_MESSAGE_FROM_HMODULE = &H800
    Private Const FORMAT_MESSAGE_FROM_STRING = &H400
    Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
    Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200
    Private Const FORMAT_MESSAGE_MAX_WIDTH_MASK = &HFF
    Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long

    ' =====================================================================
    ' NT Only
    Private Type LARGE_INTEGER
      LowPart As Long
      HighPart As Long
    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(0 To 0) As LUID_AND_ATTRIBUTES  
    End Type  

    Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
    Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Declare Function GetTokenInformation Lib "advapi32.dll" (ByVal TokenHandle As Long, TokenInformationClass As Integer, TokenInformation As Any, ByVal TokenInformationLength As Long, ReturnLength As Long) As Long
    Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (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 LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long

    Private Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege"
    Private Const SE_PRIVILEGE_ENABLED = &H2

    Private Const READ_CONTROL = &H20000
    Private Const STANDARD_RIGHTS_ALL = &H1F0000
    Private Const STANDARD_RIGHTS_EXECUTE = (READ_CONTROL)
    Private Const STANDARD_RIGHTS_READ = (READ_CONTROL)
    Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
    Private Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)

    Private Const TOKEN_ASSIGN_PRIMARY = &H1
    Private Const TOKEN_DUPLICATE = (&H2)
    Private Const TOKEN_IMPERSONATE = (&H4)
    Private Const TOKEN_QUERY = (&H8)
    Private Const TOKEN_QUERY_SOURCE = (&H10)
    Private Const TOKEN_ADJUST_PRIVILEGES = (&H20)
    Private Const TOKEN_ADJUST_GROUPS = (&H40)
    Private Const TOKEN_ADJUST_DEFAULT = (&H80)
    Private Const TOKEN_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _
                TOKEN_ASSIGN_PRIMARY Or _
                TOKEN_DUPLICATE Or _
                TOKEN_IMPERSONATE Or _
                TOKEN_QUERY Or _
                TOKEN_QUERY_SOURCE Or _
                TOKEN_ADJUST_PRIVILEGES Or _
                TOKEN_ADJUST_GROUPS Or _
                TOKEN_ADJUST_DEFAULT)
    Private Const TOKEN_READ = (STANDARD_RIGHTS_READ Or TOKEN_QUERY)
    Private Const TOKEN_WRITE = (STANDARD_RIGHTS_WRITE Or _
                TOKEN_ADJUST_PRIVILEGES Or _
                TOKEN_ADJUST_GROUPS Or _
                TOKEN_ADJUST_DEFAULT)
    Private Const TOKEN_EXECUTE = (STANDARD_RIGHTS_EXECUTE)

    Private Const TokenDefaultDacl = 6
    Private Const TokenGroups = 2
    Private Const TokenImpersonationLevel = 9
    Private Const TokenOwner = 4
    Private Const TokenPrimaryGroup = 5
    Private Const TokenPrivileges = 3
    Private Const TokenSource = 7
    Private Const TokenStatistics = 10
    Private Const TokenType = 8
    Private Const TokenUser = 1

    Private Declare Function InitiateSystemShutdown Lib "advapi32.dll" Alias "InitiateSystemShutdownA" (ByVal lpMachineName As String, ByVal lpMessage As String, ByVal dwTimeout As Long, ByVal bForceAppsClosed As Long, ByVal bRebootAfterShutdown As Long) As Long
    Private Declare Function AbortSystemShutdown Lib "advapi32.dll" Alias "AbortSystemShutdownA" (ByVal lpMachineName As String) As Long
    ' ================================================================

    Public Function WinError(ByVal lLastDLLError As Long) As String
    Dim sBuff As String
    Dim lCount As Long
      
      '返回與LastDLLError關聯的錯誤消息:
      sBuff = String$(256, 0)
      lCount = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, _  
                  0, lLastDLLError, 0&, sBuff, Len(sBuff), ByVal 0)  
      If lCount Then  
       WinError = Left$(sBuff, lCount)
      End If
      
    End Function

    Public Function IsNT() As Boolean
     Static bOnce As Boolean
     Static bValue As Boolean

      '返回系統是否為NT:
      If Not (bOnce) Then
       Dim tVI As OSVERSIONINFO
       tVI.dwOSVersionInfoSize = Len(tVI)
       If (GetVersionEx(tVI) <> 0) Then
        bValue = (tVI.dwPlatformId = VER_PLATFORM_WIN32_NT)
        bOnce = True
       End If
      End If
      IsNT = bValue
    End Function

    Private Function NTEnableShutDown(ByRef sMsg As String) As Boolean
     Dim tLUID As LUID
     Dim hProcess As Long
     Dim hToken As Long
     Dim tTP As TOKEN_PRIVILEGES, tTPOld As TOKEN_PRIVILEGES
     Dim lTpOld As Long
     Dim lR As Long

      '在NT下,我們必須給試圖關閉系統的進程SE_SHUTDOWN_NAME特權
      '否則,所有企圖關閉系統的調用都會無效!

      '尋找Shoudown特權令牌的LUID:
      lR = LookupPrivilegeValue(vbNullString, SE_SHUTDOWN_NAME, tLUID)
      
      '如果我們找到了  
      If (lR <> 0) Then
            
      '取得當前進程的句柄:
      hProcess = GetCurrentProcess()
      If (hProcess <> 0) Then
        '打開令牌來Adjust和Query(用戶可能沒有權限)
        lR = OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken)
        If (lR <> 0) Then
              
          '好,我們現在可以調整Shutdown特權了:
          With tTP
            .PrivilegeCount = 1
            With .Privileges(0)
            .Attributes = SE_PRIVILEGE_ENABLED
            .pLuid.HighPart = tLUID.HighPart
            .pLuid.LowPart = tLUID.LowPart
            End With
          End With
          
          '現在允許這個進程關閉系統:
          lR = AdjustTokenPrivileges(hToken, 0, tTP, Len(tTP), tTPOld, lTpOld)
          
          If (lR <> 0) Then
            NTEnableShutDown = True
          Else
            Err.Raise eeSSDErrorBase + 6, App.EXEName & ".mShutDown", "不能shutdown:你沒有關閉本系統的權限。[" & WinError(Err.LastDllError) & "]"
          End If
          
          '記得用完后關閉這個句柄:
          CloseHandle hToken
        Else
          Err.Raise eeSSDErrorBase + 6, App.EXEName & ".mShutDown", "不能shutdown:你沒有關閉本系統的權限。[" & WinError(Err.LastDllError) & "]"
        End If
      Else
        Err.Raise eeSSDErrorBase + 5, App.EXEName & ".mShutDown", "不能shutdown:不能終止當前進程。[" & WinError(Err.LastDllError) & "]"
      End If
      Else
      Err.Raise eeSSDErrorBase + 4, App.EXEName & ".mShutDown", "不能shutdown:找不到SE_SHUTDOWN_NAME特權值。[" & WinError(Err.LastDllError) & "]"
      End If

    End Function


    Public Function NTForceTimedShutdown( _
      Optional ByVal lTimeOut As Long = -1, _
      Optional ByVal sMsg As String = "", _
      Optional ByVal sMachineNetworkName As String = vbNullString, _
      Optional ByVal bForceAppsToClose As Boolean = False, _
      Optional ByVal bReboot As Boolean = False _
      ) As Boolean
     Dim lR As Long
      
      If IsNT Then
      '如果我們在NT下,確信我們已經給了這個進程關閉系統的特權:
      If Not (NTEnableShutDown(sMsg)) Then
        Exit Function
      End If
      
      '這是定時關閉系統的代碼:
      lR = InitiateSystemShutdown(sMachineNetworkName, sMsg, lTimeOut, bForceAppsToClose, bReboot)
      If (lR = 0) Then
        Err.Raise eeSSDErrorBase + 2, App.EXEName & ".mShutDown", "InitiateSystemShutdown failed: " & WinError(Err.LastDllError)
      End If

      Else
      Err.Raise eeSSDErrorBase + 1, App.EXEName & ".mShutDown", "函數僅在Windows NT下有效。"
      End If
    End Function


    Public Function NTAbortTimedShutdown(Optional ByVal sMachineNetworkName As String = vbNullString)  
     AbortSystemShutdown sMachineNetworkName  
    End Function  


      為了試驗一次shutdown,在窗體上放兩個Command按鈕和一個Text,然后粘貼一下代碼。注意,你必須在運行前保存你的工作,因為Shutdown也將關閉VB且不會給你任何有關保存的詢問!
      點擊Command1,它根據Text里的值開始一次定時關機。要終止Shutdown,點Command2。

    Private Sub Command1_Click()
      If (MsgBox("你確定要強制定時關機嗎?", vbYesNo Or vbQuestion) = vbYes) Then
      NTForceTimedShutdown CLng(Text1.Text), "系統將在" & Text1.Text & "秒后關閉..."
    End If
    End Sub

    Private Sub Command2_Click()
    NTAbortTimedShutdown
    End Sub

    Private Sub Form_Load()
    Text1.Text = 60
    End Sub

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>