PRB: Windows NT API ExitWindowsEx 재부팅 있지 않음

기술 자료 번역 기술 자료 번역
기술 자료: 176695 - 이 문서가 적용되는 제품 보기.
이 문서가 보관되었습니다. "그대로" 제공되었으며, 업데이트가 되지 않을 것입니다.
모두 확대 | 모두 축소

이 페이지에서

현상

ExitWindowsEx API를 사용하여 Windows NT 및 Windows 2000에서 시스템을 다시 부팅할 때 컴퓨터를 다시 부팅해야 있지 않습니다.

원인

프로그래밍 방식으로 Windows NT 또는 Windows 2000 시스템을 다시 부팅해야 하는 프로세스를 SE_SHUTDOWN_NAME 권한이 필요합니다. 기본적으로 Visual Basic 응용 프로그램에 이 권한이 없는 및 따라서 컴퓨터를 부팅합니다.

해결 방법

ExitWindowsEx Windows NT 또는 Windows 2000에서 시스템을 다시 부팅해야 API 얻기 위해 SE_SHUTDOWN_NAME 사용 권한이 설정해야 합니다. 다음 단계는 Windows NT 및 Windows 2000에서 작동하도록 ExitWindowsEx API 가져오는 방법을 설명합니다.

단계 단계는 예제

  1. 새 표준 EXE Visual Basic에서 만듭니다. 기본적으로 Form1이 만들어집니다.
  2. Form1의 코드를 봅니다. 선언 구역에 다음 코드를 추가하여:
          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_SHUTDOWN As Long = 1
          Private Const EWX_FORCE As Long = 4
          Private Const EWX_REBOOT = 2
    
          Private Declare Function ExitWindowsEx Lib "user32" (ByVal _
               dwOptions As Long, ByVal dwReserved As Long) 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
    
    					
  3. 다음 코드를 사용하여 AdjustToken 라는 프로시저 추가:
          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()
             OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or _
                TOKEN_QUERY), hdlTokenHandle
    
          ' Get the LUID for shutdown privilege.
             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.
             AdjustTokenPrivileges hdlTokenHandle, False, _
             tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded
    
         End Sub
    
    					
  4. 폼에 있는 명령 단추 추가. Click 이벤트는 다음 코드를 추가하여:
          Private Sub Command1_Click()
             AdjustToken
             ExitWindowsEx (EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), &HFFFF
          End Sub
    
    					
  5. 프로젝트를 저장하고 실행 파일을 빌드하십시오. 실행 파일을 실행하고 있는 CommandButton 컴퓨터가 예상대로 다시 부팅됩니다.

현재 상태

이것은 의도적으로 설계된 동작입니다.

참조

자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
142820HOWTO: 16비트 VB 응용 프로그램에서 Windows 종료

76981VB3: HOWTO: Visual Basic 응용 프로그램에서 Windows 종료

168796HOWTO: 프로그래밍 방식으로 다시 시작하거나 다른 컴퓨터에 로그온

속성

기술 자료: 176695 - 마지막 검토: 2014년 2월 21일 금요일 - 수정: 3.1
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 6.0 Learning Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 32-Bit Enterprise Edition
키워드:?
kbnosurvey kbarchive kbmt kb32bitonly kbprb KB176695 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com