#define WIN32_LEAN_AND_MEAN #include #include #include #include #include int __cdecl wmain(int argc, wchar_t** argv) { if(argc < 2) { std::wcout << L"Usage: Sid2String SidOrAcctName\n"; return 1; } // if this isn't a sid if(!((towupper(argv[1][0]) == L'S') && (argv[1][1] == L'-'))) { std::wstring account = argv[1]; std::wstring system; std::wstring::size_type slashPos = account.find(L"\\"); if(slashPos != std::wstring::npos) { system = account.substr(0, slashPos); account.erase(0, slashPos + 1); } DWORD sidReq = 0, domReq = 0; SID_NAME_USE snu = SidTypeUser; LPCWSTR systemStr = system.empty() ? NULL : system.c_str(); LookupAccountName( systemStr, account.c_str(), NULL, &sidReq, NULL, &domReq, &snu ); std::wstring domain(domReq, 0); BYTE sidBuffer[SECURITY_MAX_SID_SIZE] = {0}; sidReq = ARRAYSIZE(sidBuffer); if(LookupAccountName( systemStr, account.c_str(), sidBuffer, &sidReq, &domain[0], &domReq, &snu ) ) { LPWSTR pStrSid = NULL; if(ConvertSidToStringSid(sidBuffer, &pStrSid)) { std::wcout << L"Account " << argv[1] << L" has sid \"" << pStrSid << L"\"\n"; LocalFree(pStrSid); } else { DWORD err = GetLastError(); std::wcout << L"ConvertSidToStringSid failed with error " << err << L'\n'; } } else { DWORD err = GetLastError(); std::wcout << L"LookupAccountName failed with error " << err << L'\n'; } } else { PSID pSid = NULL; if(ConvertStringSidToSid(argv[1], &pSid)) { SID_NAME_USE snu; DWORD nameReq = 0, domReq = 0; LookupAccountSid( NULL, pSid, NULL, &nameReq, NULL, &domReq, &snu ); std::wstring name(nameReq, 0), domain(domReq, 0); if(LookupAccountSid( NULL, pSid, &name[0], &nameReq, &domain[0], &domReq, &snu) ) { domain.erase(domain.length() - 1); name.erase(name.length() - 1); std::wcout << L"SID " << argv[1] << L" is account \"" << domain << (domain.empty() ? L"" : L"\\") << name << L"\"\n"; } else { DWORD err = GetLastError(); std::wcout << L"LookupAccountSid failed for SID \"" << argv[1] << L"\" with error " << err << L'\n'; } LocalFree(pSid); } else { DWORD err = GetLastError(); std::wcout << L"ConvertStringSidToSid failed with error " << err << L'\n'; } } return 0; }