1

사용자의 Outlook 연락처를 업데이트하려면 보너스를 사용하려고합니다. 내가 영향을받는 사용자는 exchangeUser에서 전달되고 "대상 사용자"라고합니다. 내가 나를하지 않고 "대상 사용자"가 아닌 제 3 사용자 "테스트 사용자"로 로그인을 시도보너스에서 MAPI_E_FAILONEPROVIDER을 (를)

public OutlookFolders(string outlookRootFolder, string exchangeUser, string mailServer) 
{ 
    var session = new RDOSessionClass(); 
    session.LogonExchangeMailbox(exchangeUser, mailServer); 
    session.Stores.FindExchangePublicFoldersStore(); 
    var store = session.GetSharedMailbox(exchangeUser); 
    //... 
} 

: 나는 나 자신으로 로그인 실행할 때 이 코드는 작동합니다. 이 FindExchangePublicFoldersStore을 얻을 때 내 프로그램은 실행시 암호 프롬프트를 제공하고, 내 자격 증명을 작성하지 않는 경우 오류와 함께 실패합니다

System.Runtime.InteropServices.COMException (0x8004011D): Error in 
    IMAPISession.OpenMsgStore(pbExchangeProviderPrimaryUserGuid): 
    MAPI_E_FAILONEPROVIDER 
ulVersion: 0 
Error: Microsoft Exchange is not available. Either there are network 
    problems or the Exchange computer is down for maintenance. 
Component: Microsoft Exchange Information Store 
ulLowLevelError: 2147746069 
ulContext: 1318 

내가 대상 "의"테스트 사용자 "소유자 권한을 부여 시도 사용자의 "사서함 및 연락처 폴더. 차이를 만드는 것 같지 않습니다. 이 기능을 사용하려면 다른 권한을 설정해야합니까?

답변

3

엄지 손가락의 규칙은, 문제의 사서함에 액세스 할 수있는 사용자로 코드를 실행 현재 사용자에 대한 LogonExchangeMailbox를 호출 한 후 GetSharedMailbox를 사용하여 다른 사용자의 사서함을 열 수 있습니다.

+0

도움 주셔서 감사합니다. 구속은 훌륭한 도구입니다. – RossFabricant

2

다음은 드미트리의 대답입니다. 또한 Milan's blog의 기능을 사용합니다.

 public OutlookFolders(string exchangeUser, string mailServer) 
     { 
      var session = new RDOSessionClass(); 
      var userFullName = GetFullName("DOMAIN-NT\\" + Environment.UserName); 
      session.LogonExchangeMailbox(userFullName, mailServer); 
      session.Stores.FindExchangePublicFoldersStore(); 
      var store = session.GetSharedMailbox(exchangeUser); 
      rootFolder = store.GetDefaultFolder((rdoDefaultFolders)OlDefaultFolders.olFolderContacts); 
     } 

     public static string GetFullName(string strLogin) 
     { 
      string str = ""; 
      string strDomain; 
      string strName; 

      // Parse the string to check if domain name is present. 
      int idx = strLogin.IndexOf('\\'); 
      if (idx == -1) 
      { 
       idx = strLogin.IndexOf('@'); 
      } 

      if (idx != -1) 
      { 
       strDomain = strLogin.Substring(0, idx); 
       strName = strLogin.Substring(idx + 1); 
      } 
      else 
      { 
       strDomain = Environment.MachineName; 
       strName = strLogin; 
      } 

      DirectoryEntry obDirEntry = null; 
      try 
      { 
       obDirEntry = new DirectoryEntry("WinNT://" + strDomain + "/" + strName); 
       PropertyCollection coll = obDirEntry.Properties; 
       object obVal = coll["FullName"].Value; 
       str = obVal.ToString(); 
      } 
      catch (System.Exception ex) 
      { 
       str = ex.Message; 
      } 
      return str; 
     }