Установка драйвера для незалогиненого пользователя Windows Vista/7

Тема в разделе "WASM.NT.KERNEL", создана пользователем roadking, 27 апр 2010.

  1. roadking

    roadking New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2010
    Сообщения:
    6
    Помогите решить проблему.
    Моя задача написать службу, с помощью которой можно инсталировать драйвера для незалогиненых пользователей.
    На пример есть набор машин, на который установлен мой сервис.
    Есть также драйвер инсталер, который используя 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.

    Подскажите, как побороть? Как создать процесс для инсталера с правами, позволяющими ставить драйвера и проверять цифровые подписи?
     
  2. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Что-то совсем загнули вы.
    1) Не проще ли просто через CreateProcess запускать инсталятор? Если сервис запущен от SYSTEM, то и проги которые он будет запускать, тоже будут запущены от SYSTEM и никаких токинов не нужно
    2) если всё таки есть какието ограничения, то пусть сервис запускает прогу под учеткой админа.
    т.е. чтобы сам сервис запускался под админом с наивысшими провами. Просто может быть такое что UAC не дает сразу полные права. Хотя тож врядли.
    3) зачем чтото инсталить и грузить? Не проще просто прописать в реестре дров и запустить через NtLoadDriver или прописать и запустить через сервисы.
     
  3. roadking

    roadking New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2010
    Сообщения:
    6
    а как быть если пользователь не залогинен?
     
  4. roadking

    roadking New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2010
    Сообщения:
    6
    служба запущена от SYSTEM
    CreateProcess отрабатывает, но setupapi возвращает ту же ошибку :dntknw:
     
  5. assasincore

    assasincore New Member

    Публикаций:
    0
    Регистрация:
    7 апр 2010
    Сообщения:
    55
    А если попробывать run as administrator? Процесс же можно создать когда administrator не залогинен?
     
  6. roadking

    roadking New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2010
    Сообщения:
    6
    пробывал так:

    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
     
  7. assasincore

    assasincore New Member

    Публикаций:
    0
    Регистрация:
    7 апр 2010
    Сообщения:
    55
    А кто будет нажимать на продолжения установки sign/unsign драйверов? похожу в windows что то не инитиадизируется без logon...
     
  8. roadking

    roadking New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2010
    Сообщения:
    6
    В ранних версиях Windows, таких как XP, Windows 2000 всё работает. Мой драйвер подписан правильно. Корневой сертификат есть в Root Storege.

    нажимать не надо. Оно не спрашевает подтверждение. Для залогиненого юзера просто ставит и всё. На секунду мигает окошко и воля

    Есть идеи как определить?
     
  9. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    Скорее всего, setupapi вылетает из-за отсутствия десктопа (т.к. setupapi - интерактивный процесс, то должен производить вывод в WinSta0). Попробуйте вызвать LogonUser с LOGON32_LOGON_INTERACTIVE - может, получится...
     
  10. roadking

    roadking New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2010
    Сообщения:
    6
    не помагает :dntknw:
     
  11. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    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."