Не удалось получить имя пользователя из SID в c ++?

0

Когда я попытался получить имя пользователя, используя приведенный ниже код, я успешно получил имя пользователя:

hres = pSvc->GetObject(L"Win32_SID.SID='S-1-5-82-1036420768-1044797643-1061213386-2937092688-4282445334'",  0, NULL, &pclsObj, NULL);

Но при назначении SID в переменную следующим образом

std::string SID = "S-1-5-82-1036420768-1044797643-1061213386-2937092688-4282445334";

hres = pSvc->GetObject(L"Win32_SID.SID=SID",  0, NULL, &pclsObj, NULL);

то я получил следующую ошибку:

Connected to root\CIMV2 WMI namespace
GetObject failed Error code = 0x8004103a
IDispatch error #3642

Не могли бы вы предложить мне правильный ввод в методе GetObject.

Теги:
visual-c++
wmi
wmi-query
sid

2 ответа

0
Лучший ответ

Я считаю, что вы ищете это:

std::wstring SID = L"S-1-5-82-1036420768-1044797643-1061213386-2937092688-4282445334";

hres = pSvc->GetObject((L"Win32_SID.SID='" + SID + L"'").c_str(),  0, NULL, &pclsObj, NULL);

Если приведенный выше код (уведомление о том, что я добавил забытый вызов c_str()), не работает для вас, вы можете попробовать это:

#include <sstream>

std::wstring SID = L"S-1-5-82-1036420768-1044797643-1061213386-2937092688-4282445334";

std::wostringstream s;
s << L"Win32_SID.SID='" << SID << L"'";

hres = pSvc->GetObject(s.str().c_str(),  0, NULL, &pclsObj, NULL);

Если это все еще не работает, я бы начал подозревать проблему с компилятором.


Вы упоминали в комментариях, которые используете древний VC++ 6.0, поэтому я попробую что-то действительно базовое (я полагаю, что ваша цель состоит в том, чтобы SID была переменной):

#include <cwchar>

std::wstring SID = L"S-1-5-82-1036420768-1044797643-1061213386-2937092688-4282445334";

const wchar_t *prefix = L"Win32_SID.SID='";
wchar_t *arg = new wchar_t[wcslen(prefix) + SID.size() + 2]; //2 = terminating ' and NUL
wcscpy(arg, prefix);
wcscat(arg, SDI.c_str());
wcscat(arg, L"'");

hres = pSvc->GetObject(arg,  0, NULL, &pclsObj, NULL);

delete[] arg;

Обратите внимание, что это не проверяет - у меня нет доступа к VC++ 6.0.

  • 0
    При инициализации SID в std :: wstring я получил ошибку C2440: «initializing»: невозможно преобразовать из «char [47]» в «class std :: basic_string <unsigned short, struct std :: char_traits <unsigned short> , класс std :: allocator <unsigned short>> 'Ни один конструктор не может принять тип источника, или разрешение перегрузки конструктора было неоднозначным
  • 0
    @ user2499879 К сожалению, я пропустил префикс L в строковом литерале. Исправлена.
Показать ещё 10 комментариев
0

В линии
hres = pSvc->GetObject(L"Win32_SID.SID=SID", 0, NULL, &pclsObj, NULL);
вы запрашиваете имя пользователя, принадлежащее String "SID". Это не сработает. Вам нужно объединить "Win32_DID.SID =" и вашу SID-String. Кроме того, вам нужно дать его как WSTRING:
std::wstring SID = L"S-1-5-82-1036420768-1044797643-1061213386-2937092688-4282445334"; std::wstring query = "Win32_DID.SID='" + SID + "'"; hres = pSvc->GetObject(query, 0, NULL, &pclsObj, NULL);

  • 0
    Когда я попробовал ваш код, я получил следующую ошибку в строке std :: wstring query = "Win32_DID.SID = '" + SID + "'"; ошибка C2679: двоичный код «+»: не определен оператор, который принимает правый операнд типа «класс std :: basic_string <unsigned short, struct std :: char_traits <unsigned short>, класс std :: allocator <unsigne d short> > '(или нет приемлемого преобразования)
  • 0
    Как и раньше - константы wstring должны иметь префикс L: `std :: wstring query = L" Win32_DID.SID = '"+ SID + L"' ";
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню