Офис надстройка возможных проблем с разрешениями - значение HRESULT 0x80004004 (электронное прерывание)
Мы разработали надстройку C# Office VSTO, которая взаимодействует с запущенным экземпляром Outlook (или запускает новый экземпляр), и она показывает признаки наличия проблем с разрешениями на некоторых компьютерах клиентов при попытке создать задачи Outlook или встречи...
Сообщение об исключении выглядит следующим образом:
Операция прервана (исключение из HRESULT: 0x80004004 (E_ABORT))
Это происходит здесь:
Outlook.Account DefaultAccount = null;
Outlook.Application outlookApp = GetOutlookApp(); //returns Application object of running Outlook instance / creates a new instance - it works for them.
DefaultAccount = GetAccountForFolder(outlookApp); //returns the default account of the user. Tried it with a simple setup, only one account etc. - it works for them
String defaultemailaddress;
//CODE RUNS UNTIL THIS POINT
if (DefaultAccount == null) //if somehow this would end up NULL, which is not the case, because: see code snippet below!
{
defaultemailaddress = outlookApp.Session.CurrentUser.AddressEntry.Address;
}
else
{
defaultemailaddress = DefaultAccount.SmtpAddress; //this could be the problem, but I can't debug it further, and it works in the code block below, to get the AccountType, so I don't understand why I couldn't get the SmtpAddress without a hard exception
}
//FAILS BEFORE THIS LINE COULD RUN.
String email = "test@emailserver.com";
После установления контакта с пользователем, они сказали нам:, что они работают под действительно ограниченным набором разрешений и сетью.
Странно то, что этот фрагмент кода на самом деле работает гладко для них, что доказывает, что соединение работает между Outlook и другой надстройкой Office:
Outlook.Application oApp = GetOutlookApp();
Outlook.Account DefaultAccount = GetAccountForFolder(oApp);
String AccountType = DefaultAccount.AccountType.ToString();
ИТ-отдел уже пытался скорректировать политику безопасности Outlook на пораженном компьютере. Они разрешили программный доступ.
Они не могут запускать инструменты с правами администратора, но это не должно быть необходимо. Факт то, что эти последние 3 строки кода работают (который получает тип учетной записи), доказывает, что приложение действительно запускается правильно, но похоже, что оно может запускать только определенные функции...
Я также хочу отметить, что они используют Exchange, но, по-видимому, у них нет проблем с синхронизацией (если это вообще может повлиять на что-либо...)
Править: Вот реализация GetAccountForFolder, которая получает Outlook по умолчанию.Объект счета. Это фрагмент кода, который я нашел лежащим вокруг, и обнаружил, что он отлично работает.
public static Outlook.Account GetAccountForFolder(Outlook.Application outlookApp)
{
// Obtain the store on which the folder resides.
Outlook.Store store = outlookApp.Session.DefaultStore;
// Enumerate the accounts defined for the session.
foreach (Outlook.Account account in outlookApp.Session.Accounts)
{
// Match the DefaultStore.StoreID of the account
// with the Store.StoreID for the currect folder.
if (account.DeliveryStore.StoreID == store.StoreID)
{
// Return the account whose default delivery store
// matches the store of the given folder.
return account;
}
}
// No account matches, so return null.
return null;
}
2 ответа:
Проблема заключается в том, что у вас естьсостояние гонки в COM-надстройке объекта . Вы должны сделать искусственную задержку в вашем методе. Просто делайте повторы, пока не добьетесь успеха, вот так:
bool isDone = false; while (!isDone) { try { // your action with Add-In here... isDone = true; } catch (System.Runtime.InteropServices.COMException exception) { // small delay Thread.Sleep(10); } }
Возможно, вам потребуется разрешить небольшую задержку после получения учетной записи.
Outlook.Account DefaultAccount = null; Outlook.Application outlookApp = GetOutlookApp(); DefaultAccount = GetAccountForFolder(outlookApp); Thread.Sleep(5000); // a bit of startup grace time.
Прерванная ошибка 0x80004004 часто появляется во взаимодействии.Outlook из-за этого, см. может отправлять электронную почту только через Outlook, если Outlook открыт