Используйте маркер потока для подключения WMI без изменения безопасности процесса

#c #c #com #wmi

Вопрос:

Я пытаюсь создать удаленное соединение WMI, используя олицетворенный токен, без изменения безопасности всего процесса. Маркер процесса не имеет разрешений на доступ к WMI в удаленной системе, но маркер потока имеет. В настоящее время я использую следующие функции:

  1. CoInitializeEx()
  2. Совместное создание()
  3. Соединительный сервер()
  4. CoSetProxyBlanket()

Мой вызов функции CoCreateInstance() выглядит следующим образом:

 hr = CoCreateInstance(  amp;CLSID_WbemLocator_local,   NULL,   CLSCTX_INPROC_SERVER | CLSCTX_ENABLE_CLOAKING,   amp;IID_IWbemLocator_local,   (LPVOID *) amp;pLocator);  

Как я понимаю, флаг контекста CLS CLSCTX_ENABLE_CLOAKING должен указывать локатору на использование маркера потока.

Мой вызов ConnectServer() выглядит следующим образом:

 hr = pLocator-gt;lpVtbl-gt;ConnectServer(  pLocator,   bstrResource,   NULL,   NULL,   NULL,   WBEM_FLAG_CONNECT_USE_MAX_WAIT,   NULL,   NULL,   amp;pServices);  

Это возвращает 0x80070005 (ERROR_ACCESS_DENIED) при запуске процесса от имени пользователя без прав в удаленной системе, но с токеном потока, который это делает.

Поскольку я не хочу изменять разрешения всего процесса, я не могу использовать CoInitializeSecurity() для настройки безопасности перед вызовом ConnectServer(). Из того, что я могу найти, CoSetProxyBlanket() можно вызвать только после ConnectServer (), так как для этого требуется прокси-служба в качестве аргумента.

  • Мне не хватает каких-либо соответствующих параметров для CoInitializeEx(), CoCreateInstance() или ConnectServer()?
  • Может ли CoSetProxyBlanket() быть вызван до ConnectServer()?
  • Есть ли что-нибудь еще, чего мне не хватает?