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

Поддержка Office 2003 завершена

8 апреля 2014 г. корпорация Майкрософт прекратила поддержку Office 2003. Это повлияло на обновления программного обеспечения и параметры безопасности. Узнайте, что это значит для вас и какие меры по безопасности можно предпринять.

ВНИМАНИЕ! Данная статья переведена с использованием программного обеспечения Майкрософт для машинного перевода и, возможно, отредактирована посредством технологии Community Translation Framework (CTF). Корпорация Майкрософт предлагает вам статьи, обработанные средствами машинного перевода, отредактированные членами сообщества Майкрософт и переведенные профессиональными переводчиками, чтобы вы могли ознакомиться со всеми статьями нашей базы знаний на нескольких языках. Статьи, переведенные с использованием средств машинного перевода и отредактированные сообществом, могут содержать смысловое, синтаксические и (или) грамматические ошибки. Корпорация Майкрософт не несет ответственности за любые неточности, ошибки или ущерб, вызванные неправильным переводом контента или его использованием нашими клиентами. Подробнее об CTF можно узнать по адресу http://support.microsoft.com/gp/machine-translation-corrections/ru.

Эта статья на английском языке: 821470
Эта статья помещена в архив. Она предлагается "как есть" и обновляться не будет.
Проблема
При выполнении кода, который олицетворяет пользователя для доступа к почтовому ящику Microsoft Office Outlook 2007, Outlook 2003 или Outlook 2002 могут перестать отвечать на запросы или может появиться сообщение об ошибке, подобное приведенному ниже:
Метод '~' объекта '~' завершен неверно
Причина
Эта проблема может возникнуть при создании новых потоков при олицетворение пользователя. Как обычная функция MAPI и объектов совместной работы (CDO) создание новых потоков, и эти новые потоки не наследуют полный доступ к маркер олицетворения пользователей.

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

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

Например первая программа должна выполнять олицетворение с помощью метода LogonUser и запуска второй программы как отдельный процесс, с помощью CreateProcessAsUser, как показано в следующем примере кода Visual Basic:
'<-- Launcher programConst LOGON32_LOGON_INTERACTIVE = 2Const LOGON32_PROVIDER_DEFAULT = 0Const CREATE_DEFAULT_ERROR_MODE = &H4000000Private 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 LongEnd TypePrivate Type PROCESS_INFORMATION   hProcess As Long   hThread As Long   dwProcessId As Long   dwThreadId As LongEnd TypePrivate 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 LongPrivate 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 LongPrivate Declare Function CloseHandle Lib "kernel32" ( _      ByVal hObject As Long) As LongPrivate 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 = NothingEnd Sub
Статус
Корпорация Майкрософт подтверждает, что это проблема в продуктах Майкрософт, перечисленных в разделе «Применяется к»..
OFFQFE 8382

Внимание! Эта статья переведена автоматически

Свойства

Номер статьи: 821470 — последний просмотр: 01/11/2015 22:49:55 — редакция: 3.0

Microsoft Outlook 2002 Standard Edition, Microsoft Office Outlook 2003, Microsoft Office Outlook 2007, русская версия

  • kbnosurvey kbarchive kberrmsg kbbug kbprb kbmt KB821470 KbMtru
Отзывы и предложения