• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

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

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

        更新時間:2022-05-14 文章作者:未知 信息來源:網絡 閱讀次數:

        在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

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 久久久久亚洲AV无码专区首JN| 亚洲av日韩专区在线观看| 无遮挡免费一区二区三区| 99无码人妻一区二区三区免费| 狠狠色婷婷狠狠狠亚洲综合| 狠狠色伊人亚洲综合网站色| 久久久久免费看黄a级试看| 亚洲国产成人a精品不卡在线 | 久久亚洲一区二区| 黄页网址在线免费观看| 嘿嘿嘿视频免费网站在线观看| 久久亚洲精品视频| 一级做受视频免费是看美女| 精品国产免费一区二区| 亚洲丰满熟女一区二区v| 久久精品国产这里是免费| 亚洲综合激情另类专区| 亚洲国产精品网站在线播放 | 亚洲依依成人亚洲社区| 久久精品人成免费| 国产亚洲一区二区在线观看 | 99久久久精品免费观看国产| 亚洲国产精品国自产拍AV| 一级一级一片免费高清| 精品免费久久久久久成人影院| 亚洲人成影院午夜网站| 久久永久免费人妻精品| 国产AV无码专区亚洲AV毛网站| 一区二区视频免费观看| 日韩亚洲国产综合久久久| 日韩亚洲人成在线综合| 成人免费无码视频在线网站| 亚洲a级片在线观看| 狼群影院在线观看免费观看直播| 久久久久亚洲精品影视| 国产免费爽爽视频在线观看| 亚洲色偷偷偷鲁综合| 久久久精品视频免费观看| 亚洲日本中文字幕一区二区三区| 边摸边吃奶边做爽免费视频99| 国产成人在线观看免费网站 |