Потребителският акаунт на услугата Windows няма достъп до хранилището на сертификати

Заден план

Имам Windows 7 VM с два потребителски акаунта (condor_usr1 и condor_usr2), който се използва за компилиране на изходен код. Акаунтите condor_usr[1|2] са членове на групата администратори. Имам главна виртуална машина на HTCondor, която периодично получава задачи и присвоява всяка задача да се изпълнява на един от акаунтите condor_usr[1|2]. Услугата condor на Win7 VM работи като акаунт на локалната система, но изпълняваните задачи всъщност се изпълняват като акаунт condor_usr[1|2].

Имам ново изискване да подпиша компилирания изпълним файл. Импортирах сертификата с частен ключ в хранилището на текущ потребител\личен ключ в хранилището на сертификати на Windows.

проблем

Ако съм влязъл в Win7 VM (напр. чрез отдалечен работен плот) като един от акаунтите 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

logon type

Неща, които съм пробвал

Освен ако не е отбелязано друго, тези действия нямаха ефект и бяха отменени.

  • Добавяне на 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 VM.
  • Поставих оригиналния .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 Interop понякога изискват папка на работния плот. При неинтерактивна сесия тази 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" вместо акаунта "Local System".

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