| 99 | } |
| 100 | |
| 101 | std::vector<TokenGroup> WinSys::Token::EnumGroups(bool caps) const { |
| 102 | std::vector<TokenGroup> groups; |
| 103 | BYTE buffer[1 << 13]; |
| 104 | DWORD len; |
| 105 | if (!::GetTokenInformation(_handle.get(), caps ? TokenCapabilities : TokenGroups, buffer, sizeof(buffer), &len)) |
| 106 | return groups; |
| 107 | |
| 108 | auto data = (TOKEN_GROUPS*)buffer; |
| 109 | groups.reserve(data->GroupCount); |
| 110 | for (ULONG i = 0; i < data->GroupCount; i++) { |
| 111 | auto const& g = data->Groups[i]; |
| 112 | TokenGroup group; |
| 113 | Sid sid(g.Sid); |
| 114 | group.Sid = sid.AsString(); |
| 115 | group.Name = sid.UserName(&group.Use); |
| 116 | if (group.Name.empty()) { |
| 117 | group.Name = group.Sid; |
| 118 | group.Use = SidTypeUnknown; |
| 119 | } |
| 120 | group.Attributes = (SidGroupAttributes)g.Attributes; |
| 121 | groups.push_back(std::move(group)); |
| 122 | } |
| 123 | return groups; |
| 124 | } |
| 125 | |
| 126 | std::vector<TokenPrivilege> Token::EnumPrivileges() const { |
| 127 | std::vector<TokenPrivilege> privs; |