Олицетворение пользователя в коде может привести к перестает отвечать или вызывают сообщение об ошибке «Сбой метода»

Переводы статьи Переводы статьи
Код статьи: 821470 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

Проблема

При выполнении кода, который олицетворяет пользователя для доступа к почтовому ящику Microsoft Office Outlook 2007, Outlook 2003 или Outlook 2002 могут перестать отвечать на запросы или может появиться сообщение об ошибке, подобное приведенному ниже:
Метод '~' объекта '~' завершен неверно

Причина

Эта проблема может возникнуть при создании новых потоков при олицетворение пользователя. Как обычная функция MAPI и объектов совместной работы (CDO) создание новых потоков, и эти новые потоки не наследуют полный доступ к маркер олицетворения пользователей.

Примечание.Олицетворение с MAPI не поддерживается поведение.

Временное решение

Корпорация Майкрософт предлагает примеры программного кода только для иллюстрации, без каких-либо явных или подразумеваемых гарантий.. Включая, но не ограничивая, подразумеваемые гарантии товарности или пригодности для использования в определенных целях.. В данной статье предполагается, что вы знакомы с языком программирования предложенном в примере, а также с средствами, которые используются для создания и отладки.. Сотрудники службы поддержки Майкрософт могут объяснить работу конкретной процедуры, но не. будут изменять примеры для реализации дополнительных возможностей или удовлетворения требований конкретных пользователей..

Чтобы обойти эту проблему, разделите код на двух отдельных программ.

Например первая программа должна выполнять олицетворение с помощью метода LogonUser и запуска второй программы как отдельный процесс, с помощью CreateProcessAsUser, как показано в следующем примере кода Visual Basic:
'<-- 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

Статус

Корпорация Майкрософт подтверждает, что это проблема в продуктах Майкрософт, перечисленных в разделе «Применяется к»..

Свойства

Код статьи: 821470 - Последний отзыв: 25 ноября 2010 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Outlook 2002 Standard Edition
  • Microsoft Office Outlook 2003
  • Microsoft Office Outlook 2007
Ключевые слова: 
kberrmsg kbbug kbprb kbmt KB821470 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:821470

Отправить отзыв

 

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