| 24 | |
| 25 | |
| 26 | static std::wstring getLogonSid() { |
| 27 | // Get process token with TOKEN_QUERY privilege. |
| 28 | std::wstring logonSidStr; |
| 29 | HANDLE processToken = INVALID_HANDLE_VALUE; |
| 30 | try { |
| 31 | if (!::OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &processToken)) { |
| 32 | throw std::runtime_error("Fail to open process token"); |
| 33 | } |
| 34 | |
| 35 | DWORD bufSize = 0; |
| 36 | if (!::GetTokenInformation(processToken, TokenGroups, nullptr, 0, &bufSize)) { |
| 37 | if (::GetLastError() != ERROR_INSUFFICIENT_BUFFER) { |
| 38 | throw std::runtime_error("Fail to get token info buffer size."); |
| 39 | } |
| 40 | } |
| 41 | |
| 42 | auto tokenGroupsBuf = std::make_unique<char[]>(bufSize); |
| 43 | if (!::GetTokenInformation(processToken, TokenGroups, tokenGroupsBuf.get(), bufSize, &bufSize)) { |
| 44 | DWORD err = ::GetLastError(); |
| 45 | throw std::runtime_error("Fail to get token group data."); |
| 46 | } |
| 47 | |
| 48 | auto groups = reinterpret_cast<TOKEN_GROUPS*>(tokenGroupsBuf.get()); |
| 49 | PSID logonSid = nullptr; |
| 50 | for (DWORD i = 0; i < groups->GroupCount; ++i) { |
| 51 | auto group = groups->Groups[i]; |
| 52 | if ((group.Attributes & SE_GROUP_LOGON_ID) == SE_GROUP_LOGON_ID) { |
| 53 | /// Found the logon group. |
| 54 | logonSid = group.Sid; |
| 55 | break; |
| 56 | } |
| 57 | } |
| 58 | |
| 59 | if (logonSid) { |
| 60 | logonSidStr = sidToStr(logonSid); |
| 61 | } |
| 62 | } |
| 63 | catch (...) { |
| 64 | if (processToken != INVALID_HANDLE_VALUE) { |
| 65 | ::CloseHandle(processToken); |
| 66 | } |
| 67 | } |
| 68 | return logonSidStr; |
| 69 | } |
| 70 | |
| 71 | static bool getProcessOwnerSids(std::wstring& ownerSidStr, std::wstring& groupSidStr) { |
| 72 | PSID ownerSid = nullptr; |
no test coverage detected