Помогите решить проблему. Моя задача написать службу, с помощью которой можно инсталировать драйвера для незалогиненых пользователей. На пример есть набор машин, на который установлен мой сервис. Есть также драйвер инсталер, который используя setupapi инсталирует драйвера. Администратор с помощью winexe устанавлевает дрова сразу на несколько машин. Для залогиненых пользователей всё работает как часы, но проблема возникает в случае если пользователь не залогинен и именно на операционках Vista и W7. Как работает моя служба: 1. обределяю token пользователя (служба работает под пользователем SYSTEM) 2. создаю процесс CreateProcessAsUser в который передаю token полученный на шаге 1. 3. процесс выполняет exe-инсталятор драйвера. когда пользователь залогинен, я могу получить токен и всё работает нормально, в противном случае token == NULL и соответственно у моего драйвер инсталера не хватает прав для установки драйвера. setupapi.SetupCopyOEMInf возвращает ошибку: CERT_E_UNTRUSTEDROOT A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider. Подскажите, как побороть? Как создать процесс для инсталера с правами, позволяющими ставить драйвера и проверять цифровые подписи?
Что-то совсем загнули вы. 1) Не проще ли просто через CreateProcess запускать инсталятор? Если сервис запущен от SYSTEM, то и проги которые он будет запускать, тоже будут запущены от SYSTEM и никаких токинов не нужно 2) если всё таки есть какието ограничения, то пусть сервис запускает прогу под учеткой админа. т.е. чтобы сам сервис запускался под админом с наивысшими провами. Просто может быть такое что UAC не дает сразу полные права. Хотя тож врядли. 3) зачем чтото инсталить и грузить? Не проще просто прописать в реестре дров и запустить через NtLoadDriver или прописать и запустить через сервисы.
пробывал так: HANDLE hToken = NULL; DWORD dwSize; WCHAR szUserProfile[256] = L""; if(!LogonUser(_T("Administrator"),NULL,_T("111"),LOGON32_LOGON_NEW_CREDENTIALS, return; if(!CreateEnvironmentBlock(&lpvEnv, hToken, TRUE)) return; dwSize = sizeof(szUserProfile)/sizeof(WCHAR); if (!GetUserProfileDirectory(hToken, szUserProfile, &dwSize)) return; BOOL bOk=CreateProcessAsUser(hToken,NULL,szBuf,NULL,NULL,FALSE,CREATE_UNICODE_ENVIRONMENT,lpvEnv,NULL,&si,&pi); Процесс создается, всё гуд. Ошибок нет. Но setupapi возвращает CERT_E_UNTRUSTEDROOT
А кто будет нажимать на продолжения установки sign/unsign драйверов? похожу в windows что то не инитиадизируется без logon...
В ранних версиях Windows, таких как XP, Windows 2000 всё работает. Мой драйвер подписан правильно. Корневой сертификат есть в Root Storege. нажимать не надо. Оно не спрашевает подтверждение. Для залогиненого юзера просто ставит и всё. На секунду мигает окошко и воля Есть идеи как определить?
Скорее всего, setupapi вылетает из-за отсутствия десктопа (т.к. setupapi - интерактивный процесс, то должен производить вывод в WinSta0). Попробуйте вызвать LogonUser с LOGON32_LOGON_INTERACTIVE - может, получится...
CERT_E_UNTRUSTEDROOT - поиск в MSDN... Возможно, возвращается при вызове DriverPackageInstall: "CERT_E_UNTRUSTEDROOT -The catalog file has an Authenticode signature whose certificate chain terminates in a root certificate that is not trusted."