| 10 | } |
| 11 | |
| 12 | std::vector<LogonSessionData> LsaSecurity::EnumLogonSessions() { |
| 13 | std::vector<LogonSessionData> sessions; |
| 14 | |
| 15 | LUID* luid; |
| 16 | ULONG count; |
| 17 | if (!NT_SUCCESS(::LsaEnumerateLogonSessions(&count, &luid))) |
| 18 | return sessions; |
| 19 | |
| 20 | sessions.reserve(count); |
| 21 | for (ULONG i = 0; i < count; i++) { |
| 22 | SECURITY_LOGON_SESSION_DATA* data; |
| 23 | if (NT_SUCCESS(::LsaGetLogonSessionData(luid + i, &data))) { |
| 24 | LogonSessionData sd; |
| 25 | sd.Index = i + 1; |
| 26 | sd.LogonId = data->LogonId; |
| 27 | LsaStringToWstring(data->AuthenticationPackage, sd.AuthenticationPackage); |
| 28 | LsaStringToWstring(data->DnsDomainName, sd.DnsDomainName); |
| 29 | LsaStringToWstring(data->HomeDirectory, sd.HomeDirectory); |
| 30 | LsaStringToWstring(data->HomeDirectoryDrive, sd.HomeDirectoryDrive); |
| 31 | LsaStringToWstring(data->LogonDomain, sd.LogonDomain); |
| 32 | LsaStringToWstring(data->LogonScript, sd.LogonScript); |
| 33 | LsaStringToWstring(data->LogonServer, sd.LogonServer); |
| 34 | LsaStringToWstring(data->UserName, sd.UserName); |
| 35 | LsaStringToWstring(data->Upn, sd.Upn); |
| 36 | LsaStringToWstring(data->ProfilePath, sd.ProfilePath); |
| 37 | |
| 38 | sd.LogoffTime = data->LogoffTime; |
| 39 | sd.LogonTime = data->LogonTime; |
| 40 | sd.LastFailedLogon = data->LastLogonInfo.LastFailedLogon; |
| 41 | sd.LastSuccessfulLogon = data->LastLogonInfo.LastSuccessfulLogon; |
| 42 | sd.FailedAttemptCountSinceLastSuccessfulLogon = data->LastLogonInfo.FailedAttemptCountSinceLastSuccessfulLogon; |
| 43 | sd.KickOffTime = data->KickOffTime; |
| 44 | sd.UserFlags = data->UserFlags; |
| 45 | sd.LogonType = (SecurityLogonType)data->LogonType; |
| 46 | if (data->Sid) |
| 47 | ::CopySid(_countof(sd.Sid), (PSID)sd.Sid, data->Sid); |
| 48 | else |
| 49 | ::memset(sd.Sid, 0, sizeof(sd.Sid)); |
| 50 | |
| 51 | sd.Session = data->Session; |
| 52 | sd.PasswordCanChange = data->PasswordCanChange; |
| 53 | sd.PasswordLastSet = data->PasswordLastSet; |
| 54 | sd.PasswordMustChange = data->PasswordMustChange; |
| 55 | |
| 56 | sessions.emplace_back(std::move(sd)); |
| 57 | |
| 58 | ::LsaFreeReturnBuffer(data); |
| 59 | } |
| 60 | } |
| 61 | |
| 62 | ::LsaFreeReturnBuffer(luid); |
| 63 | return sessions; |
| 64 | } |
| 65 | |
| 66 | std::wstring LsaSecurity::GetUserNameByLogonSession(PLUID sessionId) { |
| 67 | SECURITY_LOGON_SESSION_DATA* data; |
nothing calls this directly
no test coverage detected