코드에서 사용자 가장을 Outlook이 응답하지 않거나 "메서드 실패" 오류 메시지가 발생할 수 있다

기술 자료 번역 기술 자료 번역
기술 자료: 821470 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

현상

사용자가 사서함에 액세스할 수 있도록 가장합니다 코드를 실행할 때 Microsoft Office Outlook 2007, Outlook 2003 또는 Outlook 2002에서 응답하지 않거나 다음과 유사한 오류 메시지가 나타날 수 있습니다.
메서드 ' ~ '개체의' ~ ' 실패했습니다.

원인

사용자를 가장할 때 새 스레드를 만들 경우 이 문제가 발생할 수 있습니다. MAPI 및 공동 작업 데이터 개체 (CDO) 일반 함수로 새 스레드를 만들고 이러한 새 스레드는 가장된 사용자 토큰에 대한 모든 권한을 상속하지 않습니다.

참고 가장을 사용하면 MAPI 지원되는 동작입니다.

해결 과정

Microsoft는 묵시적인 보증 없이 목적으로만 프로그래밍 예제를 제공합니다. 이 포함되지만, 상품성 또는 특정 목적에의 적합성에 대한 묵시적인된 보증이 제한되지 않습니다. 이 문서에서는 만들려면 및 프로시저를 디버깅하는 데 사용되는 도구 및 여기서 설명하는 프로그래밍 언어에 익숙한 사용자를 대상으로 합니다. Microsoft 지원 엔지니어는 특정 절차에 대한 기능을 설명할 수 있습니다. 그러나 이러한 추가 기능을 제공하거나 특정 요구 사항에 맞도록 프로시저를 구성하지는 이 예제를 수정하여지 않습니다.

이 문제를 해결하려면 두 가지 별도의 프로그램으로 코드를 분할하십시오.

For example, the first program should do the impersonation by using LogonUser, and then start the second program as a separate process by using CreateProcessAsUser as in the following sample Visual Basic code:
'<-- Launcher program
Const LOGON32_LOGON_INTERACTIVE = 2
Const LOGON32_PROVIDER_DEFAULT = 0
Const CREATE_DEFAULT_ERROR_MODE = &H4000000

Private Type STARTUPINFO

   cb As Long
   lpReserved As Long ' !!! must be Long for Unicode string
   lpDesktop As Long  ' !!! must be Long for Unicode string
   lpTitle As Long    ' !!! must be Long for Unicode string
   dwX As Long
   dwY As Long
   dwXSize As Long
   dwYSize As Long
   dwXCountChars As Long
   dwYCountChars As Long
   dwFillAttribute As Long
   dwFlags As Long
   wShowWindow As Integer
   cbReserved2 As Integer
   lpReserved2 As Long
   hStdInput As Long
   hStdOutput As Long
   hStdError As Long

End Type

Private Type PROCESS_INFORMATION

   hProcess As Long
   hThread As Long
   dwProcessId As Long
   dwThreadId As Long

End Type

Private Declare Function CreateProcessAsUser Lib "advapi32.dll" _
      Alias "CreateProcessAsUserA" _
      (ByVal hToken As Long, _
      ByVal lpApplicationName As Long, _
      ByVal lpCommandLine As String, _
      ByVal lpProcessAttributes As Long, _
      ByVal lpThreadAttributes As Long, _
      ByVal bInheritHandles As Long, _
      ByVal dwCreationFlags As Long, _
      ByVal lpEnvironment As Long, _
      ByVal lpCurrentDirectory As String, _
      lpStartupInfo As STARTUPINFO, _
      lpProcessInformation As PROCESS_INFORMATION) As Long

Private Declare Function LogonUser Lib "advapi32.dll" Alias "LogonUserA" ( _
      ByVal lpszUsername As String, _
      ByVal lpszDomain As String, _
      ByVal lpszPassword As String, _
      ByVal dwLogonType As Long, _
      ByVal dwLogonProvider As Long, _
      phToken As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" ( _
      ByVal hObject As Long) As Long

Private Sub Command1_Click()
      Dim hToken As Long
      Dim ulResult As Long
      Dim startup As STARTUPINFO
      Dim process As PROCESS_INFORMATION
    
      ulResult = LogonUser("ImpersonatedUsed", "ImpersonatedDomain", _
         "ImpersonatedUserPassword", LOGON32_LOGON_INTERACTIVE, _
            LOGON32_PROVIDER_DEFAULT, hToken)

      If ulResult = 0 Then
         MsgBox "Error in LogonUser:  " & Err.LastDllError
         Exit Sub
      End If

      startup.cb = Len(startup)
      'TODO: Replace 'mail.exe' with the name of the program you wish to start
      ulResult = CreateProcessAsUser(hToken, 0&, "mail.exe", 0&, 0&, _
         False, CREATE_DEFAULT_ERROR_MODE, 0&, "path", startup, process)

      If ulResult = 0 Then
         MsgBox "Error in CreateProcessAsUser:  " & Err.LastDllError
         Exit Sub
      End If
    
      CloseHandle hToken
    
End Sub

'<-- End of first program 

'<-- Start of second process

'<-- Mail.exe project:
Private Sub Command1_Click()

On Error GoTo ErrHandler

   Dim oSession 'As MAPI.Session
   Set oSession = CreateObject("MAPI.Session")
   oSession.Logon , , , , , True, "ServerName" & vbLf & "MailboxName"

   Dim oFolder 'As MAPI.Folder
   Set oFolder = oSession.GetDefaultFolder(1) 'CdoDefaultFolderInbox
   Set oMessages = oFolder.Messages
   Set oMessage = oMessages.GetFirst

   MsgBox oMessage.Subject
   Set oMessage = Nothing

   MsgBox "1"
   Set oMessages = Nothing

   MsgBox "2"
   Set oFolder = Nothing

   MsgBox "3"
   oSession.Logoff  '

   MsgBox "4"
      Set oSession = Nothing
   MsgBox "Done"

   Exit Sub
    
ErrHandler:
   MsgBox Err.Number & "   -->   " & Err.Description
   Set oMessage = Nothing
   Set oMessages = Nothing
   Set oFolder = Nothing
   oSession.Logoff
   Set oSession = Nothing

End Sub

현재 상태

Microsoft는 "본 문서의 정보는 다음의 제품에 적용됩니다." 절에 나열된 Microsoft 제품에서 이 문제를 확인했습니다.

속성

기술 자료: 821470 - 마지막 검토: 2007년 4월 30일 월요일 - 수정: 2.1
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Outlook 2002 Standard Edition
  • Microsoft Office Outlook 2003
  • Microsoft Office Outlook 2007
키워드:?
kbmt kberrmsg kbbug kbprb KB821470 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