Различия в разрешениях между службой Windows и консольным приложением

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

  • Консольное приложение, выполняемое пользователем-администратором
  • Служба Windows, выполняемая пользователем-администратором

Я предположил, что если эти два кода будут выполняться одним и тем же пользователем, они будут иметь одинаковые привилегии. Похоже, это неправда. Когда я пытаюсь использовать службу Windows (выполняется с правами администратора), я получаю

TargetInvocationException
CryptographicException

Can't initialize DLL provider at System.Security.Cryptography.Utils.CreateProvHandle(.

Насколько я читал в Интернете, возможно, это проблема с разрешениями. Консольное приложение работает нормально.

  • В чем разница между службой Windows и консольным приложением, если они выполняются одним и тем же пользователем?

  • Можно ли добиться таких же результатов с помощью службы Windows?

Бесплатное виртуальное пиво для человека, который его решает;)

Спасибо!


person user256038    schedule 02.06.2010    source источник


Ответы (3)


Вы пробовали запускать свою службу в качестве локальной службы, сетевой службы и локальной системы? Нет разницы с их изменением? Я знаю, что мне пришлось сменить локальную службу на локальную систему, чтобы предоставить ей доступ к моим файлам. Не уверен, что вы вообще используете какие-либо файлы, но, по крайней мере, есть что проверить.

person Brandi    schedule 03.06.2010
comment
Хорошо, спасибо, Брэнди, это сработало !! :). Проблема в том, что я не знаю почему. Я перешел на другого пользователя, потому что у сетевой службы нет доступа к сертификату. Каким-то образом я не понимаю, сертификат закончился в папке: - c: \ windows \ system32 \ config \ systemprofile \ application data \ microsoft \ systemcertificates \ my \ Certificates. Как будто этот файл находится в этой папке, он может работать с локальной службой, и я не получаю сообщение об ошибке: - Не удается инициализировать поставщик DLL в System.Security.Cryptography.Utils.CreateProvHandle (. Кто-нибудь знает, как этот файл закончился в этой папке? Спасибо, Брэнди! - person user256038; 14.06.2010

Одно из различий между консольным приложением и службой Windows, которое вызвало у меня головную боль, заключается в том, что служба Windows использует C: \ Windows \ System32 в качестве текущего каталога. Не знаю, поможет ли это в вашем случае, но я думаю, вы могли бы попробовать: http://igorbrejc.net/development/c/windows-services-and-working-directories

person Igor Brejc    schedule 02.06.2010
comment
Можете ли вы опубликовать полное описание исключения (включая трассировку стека)? - person Igor Brejc; 03.06.2010

К сожалению, у меня нет решения для вас, но службы Windows ведут себя совсем не так, как обычные программы. Например, вы не сможете получить доступ к сетевым дискам из службы Windows, если только ваша служба не запустится ПОСЛЕ службы, которая инициализирует эти диски.

Вы можете добавить зависимости к своему сервису, чтобы они зависели от нужных вам сервисов, или в самом конце. Это МОЖЕТ решить вашу проблему, но я не могу этого гарантировать.

person Jan Dörrenhaus    schedule 02.06.2010
comment
Спасибо, Каллаш, спасибо большое. К сожалению, мой сервис запускается вручную, поэтому все возможные зависимости устранены раньше. - person user256038; 02.06.2010
comment
Если вы всегда запускаете свою службу вручную, какой смысл иметь ее как службу Windows в первую очередь, если вы не возражаете, если я спрашиваю? - person Jan Dörrenhaus; 02.06.2010
comment
Ага, хороший вопрос;). Запускаю сервис вручную просто для тестирования. На рабочем сервере он должен запускаться автоматически :). - person user256038; 02.06.2010
comment
Тогда единственное другое решение, которое я могу придумать, - это создать отдельный AppDomain и самостоятельно позаботиться о безопасности. Но я не эксперт в этом, думаю, вы захотите погуглить. - person Jan Dörrenhaus; 02.06.2010
comment
Спасибо, Каллаш, но никак. Мне удалось установить Инструмент настройки .Net Framework 2.0, и я предоставил всем группам кода «Полное доверие». Но это не работает ... Не знаю, на что смотреть ... - person user256038; 02.06.2010
comment
Создание домена приложения выполняется в вашем коде, а не с помощью какого-либо инструмента настройки. - person Jan Dörrenhaus; 02.06.2010
comment
Да, я знаю. Я попытался изменить разрешения домена приложения по умолчанию, в котором выполняются все приложения. Все кодовые зоны настроены на «полное доверие» - person user256038; 03.06.2010