Учетная запись пользователя службы Windows не может получить доступ к хранилищу сертификатов

Задний план

У меня есть виртуальная машина Windows 7 с двумя учетными записями пользователей (condor_usr1 и condor_usr2), которые используются для компиляции исходного кода. Учетные записи condor_usr[1|2] являются членами группы администраторов. У меня есть главная виртуальная машина HTCondor, которая периодически получает задания и назначает каждое задание для запуска на одной из учетных записей condor_usr[1|2]. Служба condor на виртуальной машине Win7 работает как локальная системная учетная запись, но выполняемые задания на самом деле выполняются как учетная запись condor_usr[1|2].

У меня есть новое требование подписать скомпилированный исполняемый файл. Я импортировал сертификат с закрытым ключом в хранилище ключей Current User\Personal в хранилище сертификатов Windows.

Проблема

Если я вошел в виртуальную машину Win7 (например, через удаленный рабочий стол) как одна из учетных записей condor_usr, то компиляции, запущенные под этой учетной записью, успешно подпишут исполняемый файл, но компиляции, запущенные под другой учетной записью, не смогут подписать исполняемый файл. Например, если я вошел в систему как condor_usr2, то компиляции, запущенные под condor_usr2, будут успешно подписаны, а компиляции, запущенные под condor_usr1, не подпишутся. Если я выйду из системы, обе учетные записи не подпишутся.

Конкретная ошибка, которую я получаю:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets(264,9): error MSB3482: An error occurred while signing: The system cannot find the file specified.

Включил ведение журнала аудита и обнаружил следующий журнал, который произошел одновременно с ошибкой подписи.

ошибка подписи

Цель

Подпишите скомпилированный исполняемый файл успешно независимо от того, под какой учетной записью выполняется компиляция, и без необходимости входа пользователя в систему.

Что я понял до сих пор

  • Компилируемый код/проект является решением Visual Studio 2017.
  • Метод подписи — подписание манифеста ClickOnce (опция в проекте VS2017).
  • При запуске задания компиляции оно регистрируется как condor_usr[1|2], используя тип входа 2 (интерактивный вход). https://ss64.com/nt/syntax-logon-types.html

тип входа

Вещи, которые я пробовал

Если не указано иное, эти действия не имели никакого эффекта и были отменены.

  • Добавление учетных записей condor_usr в группу операторов шифрования.
  • Importing the certificate w/ private key to the Local Computer\Personal key store.
  • Использование PsExec -h make.bat для получения токена учетной записи с повышенными правами. https://docs.microsoft.com/en-us/sysinternals/downloads/psexec
  • Я подумал, что контроль учетных записей (UAC) может препятствовать доступу системной учетной записи и/или учетной записи condor_usr к хранилищу сертификатов (или закрытым ключам в хранилище сертификатов), но UAC уже отключен на виртуальной машине Win7.
  • Я поместил исходный файл сертификата .pfx в решение VS2017 и нацелил его вместо сертификата в хранилище ключей. Это не имело никакого эффекта, что наводит меня на мысль, что проблема заключается в каком-то разрешении на подпись, а не (или, возможно, в дополнение) к чистому разрешению для фактического хранилища сертификатов.
  • Я попытался запустить задание, войдя в систему через удаленный рабочий стол, а затем выйти из сеанса удаленного рабочего стола (фактический выход из системы, а не отключение), прежде чем задание перейдет к части подписания. Подписание не удалось.

person ErikusMaximus    schedule 24.09.2019    source источник
comment
Я бы также добавил это в свой контрольный список: - У меня созданы следующие папки: %windir%\system32\config\systemprofile\desktop и %windir%\syswow64\config\systemprofile\desktop (только для 64-битной ОС)   -  person Kul-Tigin    schedule 03.10.2019
comment
Я не понимаю, как эти пути связаны с проблемой...   -  person ErikusMaximus    schedule 03.10.2019
comment
Приложениям Microsoft Office (увидел некоторое пространство имен Office в сообщении об ошибке) и его COM-взаимодействию иногда требуется папка на рабочем столе. При неинтерактивном сеансе эта папка desktop будет использоваться. Стоит попробовать. Если вы выполните поиск по этим путям в Интернете, вы увидите много сообщений, говорящих how those paths relate to the problem, but it worked.   -  person Kul-Tigin    schedule 03.10.2019
comment
Ваш комментарий все еще не ясен. Я попытался поискать в Google и найти SO для этого пути, но не нашел ничего даже отдаленно связанного. Что мне делать с этим путем? Возможно, вы хотели бы опубликовать полный ответ?   -  person ErikusMaximus    schedule 03.10.2019


Ответы (1)


Убедитесь, что все учетные записи, участвующие в процессе, имеют права «Вход в качестве службы», убедившись, что они присутствуют в локальной политике «Конфигурация компьютера\Параметры Windows\Параметры безопасности\Локальные политики\Назначение прав пользователя\Вход в качестве службы». Обратите внимание, что это изменение вступает в силу при следующем входе владельца учетных записей.

Попробуйте запустить службу HTCondor напрямую как «condor_usr1» вместо учетной записи «Локальная система».

person Megabit    schedule 03.10.2019
comment
Я очень надеялся, что это сработает, но компиляция по-прежнему не работает с тем же сообщением об ошибке. Любые другие предложения? - person ErikusMaximus; 03.10.2019
comment
Служба HTCondor может олицетворять пользователей, что может вызвать проблемы с доступом к хранилищу сертификатов. Вы пытались запустить службу напрямую как condor_usr1 вместо учетной записи локальной системы и запустить задание, нацеленное на condor_usr1? Это работает без входа в систему как condor_usr1? Кроме того, в той части, где вы пытались нацелить файл PFX напрямую, но это не сработало, в чем была точная ошибка или след? Ошибка говорит, что файл не найден, возможно, инструмент подписи или скомпилированные выходные данные отсутствуют или находятся не в том месте (например, проблема с PATH)? - person Megabit; 03.10.2019
comment
При непосредственном нацеливании на файл PFX ошибка/сбой были идентичны исходной ошибке. Скомпилированные выходные данные всегда находятся в одном и том же месте, и я был бы удивлен, если бы инструмент подписи переехал. Я попробую запустить службу HTCondor как condor_usr1. - person ErikusMaximus; 03.10.2019
comment
Запуск службы HTCondor от имени condor_usr1 приводит к успешной компиляции заданий, выполняемых под управлением condor_usr1, но это не позволяет condor_usr2 обрабатывать какие-либо задания. - person ErikusMaximus; 03.10.2019
comment
Интересно, что обходной путь мог состоять в том, чтобы запустить две отдельные службы (по одной для каждого пользователя), но, к сожалению, HTCondor, похоже, не поддерживает это. Я очень подозреваю, что необходимая часть (или ссылка) отсутствует после того, как служба выдает себя за пользователя. На этом этапе я бы обошёл встроенную функцию подписи и сделал бы это вручную вот так. - person Megabit; 04.10.2019
comment
Я действительно думаю, что проблема связана с пользователем (учетная запись локальной системы против condor_usr) и некоторыми разрешениями (например, доступ к хранилищу сертификатов и т. д.), а не с фактическим событием подписания, поэтому я сомневаюсь, что изменение способа подписания приложения будет Сделать разницу. Существует способ настроить HTCondor с двумя слотами заданий, где оба слота используют одного и того же пользователя (например, condor_usr1). Я собираюсь попробовать это, запустив службу от имени учетной записи condor_usr1. - person ErikusMaximus; 04.10.2019
comment
Успех!! @Megabit, можешь отредактировать свой ответ и добавить Try running the HTCondor service directly as "condor_usr1" instead of the "Local System" account. Как только это будет сделано, я приму ваш ответ (но нам нужно поторопиться, так как награда заканчивается через несколько часов). - person ErikusMaximus; 04.10.2019
comment
Сделанный! Рад, что вы, наконец, исправили эту проблему, так как я думаю, что она у вас была некоторое время! - person Megabit; 04.10.2019
comment
Да, это проблема очень давно. Большое спасибо @Megabit за вашу помощь, без вас я бы не справился. - person ErikusMaximus; 04.10.2019