Запустить приложение CLR на среднем уровне целостности UAC? - PullRequest
3 голосов
/ 25 августа 2010

Я разрабатывал приложение на C # (WinForms), которое использует PIA Office 2007 для интеграции с Outlook 2007. В моей среде разработки UAC отключен, и все мои функции работают, но моя среда тестирования - Vista 32-bitс включенным контролем учетных записей.

В тестовой среде Outlook по умолчанию работает на среднем уровне целостности (при запуске пользователем).Моему приложению требуется высокий уровень целостности (т. Е. При запуске отображается приглашение UAC).В этом сценарии создание экземпляра класса Microsoft.Office.Interop.Outlook.Application из моего приложения завершается ошибкой с CO_E_SERVER_EXEC_FAILURE (COMException, HRESULT = 0x80080005).

Я могу обойти эту проблему двумя способами:

  1. Убедитесь, что Outlook не работает, когда мое приложение создает экземпляр Application - это заставляет Outlook работать в режиме высокой целостности, поскольку запускающий его процесс также работает с высокой целостностью.
  2. Поручить Outlook всегдазапуск от имени администратора (вкладка «Совместимость»).

Стоит отметить, что в PIA Word и Excel эта проблема не .

Есть ли способ?вокруг этой проблемы?Мое приложение не может работать с низкой целостностью, но есть вероятность, что оно может быть адаптировано для работы на среднем уровне целостности - однако я не могу понять, как это сделать.Могут ли исполняемые файлы .NET даже работать в этом режиме?

В качестве альтернативы, есть ли способ связи с Outlook, даже если существуют несовпадающие уровни целостности?Как я уже сказал, Word и Excel, похоже, не имеют проблем с этим.

1 Ответ

4 голосов
/ 25 августа 2010

Могут ли исполняемые файлы .NET работать даже в этом режиме?

.NET-приложения могут работать на любом уровне целостности UAC (включая системный и низкий).

Но у одного процесса есть только один уровень целостности (добавьте столбец целостности в Process Explorer , чтобы увидеть распределение процессов по уровням целостности).

Если вы попытаетесь запустить второй экземпляр Outlook, он просто отобразит существующий экземпляр, он активно предотвращает запуск двух экземпляров. Word и Excel нет.

Вместе они объясняют, что вы видите. При создании экземпляра объекта приложения Word или Excel запускается новый процесс Work или Excel с соответствующим уровнем целостности. Если вы сделаете это с Outlook, и Outlook уже запущен, он попытается подключиться к этому существующему процессу. Но это не удастся, если Outlook уже не работает с высокой целостностью. Вы должны иметь возможность проверить это, запустив Outlook от имени администратора (то есть с высокой степенью целостности), а затем запустив свое приложение для подключения к нему.

Требовать, чтобы пользователи запускали Outlook от имени администратора, - плохая идея (из-за рисков, связанных с вложениями в электронную почту от неизвестных сторон, запуск Outlook с высокой степенью целостности просто вызывает заражение вредоносным ПО).

Лучший подход (и именно так это делают в Explorer и т. Д.) - это разделить ваш процесс на две части, используя COM-моникеры, чтобы поднять только те части вашего приложения, которые действительно требуют повышения прав. Посмотрите этот вопрос о том, как это сделать: Как UAC повысить компонент COM с помощью .NET

...