44#include < wtsapi32.h>
55
66namespace wsudo ::exec {
7-
87bool IsUserAdministratorsGreater (bela::error_code &ec) {
98 HANDLE hToken{nullptr };
109 auto closer = bela::finally ([&] {
@@ -13,13 +12,13 @@ bool IsUserAdministratorsGreater(bela::error_code &ec) {
1312 }
1413 });
1514 if (::OpenProcessToken (::GetCurrentProcess (), TOKEN_ALL_ACCESS, &hToken) != TRUE ) {
16- ec = bela::make_system_error_code (L" OpenProcessToken " );
15+ ec = bela::make_system_error_code (L" open current process token: " );
1716 return false ;
1817 }
1918 TOKEN_ELEVATION info{0 };
2019 DWORD len = sizeof (info);
21- if (::GetTokenInformation (hToken, TOKEN_INFORMATION_CLASS:: TokenElevation, &info, len, &len) != TRUE ) {
22- ec = bela::make_system_error_code (L" GetTokenInformation " );
20+ if (::GetTokenInformation (hToken, TokenElevation, &info, len, &len) != TRUE ) {
21+ ec = bela::make_system_error_code (L" get current token elevation: " );
2322 return false ;
2423 }
2524 return info.TokenIsElevated != 0 ;
@@ -92,12 +91,13 @@ bool InitializeAsSystem(bela::error_code &ec) {
9291}
9392
9493// bela::EqualsIgnoreCase
95- [[maybe_unused]] constexpr std::wstring_view LsassName = L" lsass .exe" ;
94+ [[maybe_unused]] constexpr std::wstring_view WinLogonName = L" winlogon .exe" ;
9695constexpr DWORD INVALID_PROCESS_ID = 0xFFFFFFFF ;
97- DWORD LookupSystemProcess () {
96+ DWORD LookupSystemProcess (DWORD sid, bela::error_code &ec ) {
9897 PWTS_PROCESS_INFOW pi{nullptr };
9998 DWORD count{0 };
10099 if (::WTSEnumerateProcessesW (WTS_CURRENT_SERVER_HANDLE, 0 , 1 , &pi, &count) != TRUE ) {
100+ ec = bela::make_system_error_code (L" WTSEnumerateProcessesW: " );
101101 return INVALID_PROCESS_ID;
102102 }
103103 auto closer = bela::finally ([&] {
@@ -107,11 +107,12 @@ DWORD LookupSystemProcess() {
107107 });
108108 auto end = pi + count;
109109 for (auto it = pi; it != end; it++) {
110- if (it->SessionId == 0 && bela::EqualsIgnoreCase (LsassName , it->pProcessName ) &&
110+ if (it->SessionId == sid && bela::EqualsIgnoreCase (WinLogonName , it->pProcessName ) &&
111111 IsWellKnownSid (it->pUserSid , WinLocalSystemSid) == TRUE ) {
112112 return it->ProcessId ;
113113 }
114114 }
115+ ec = bela::make_error_code (1 , L" a suitable system process could not be found" );
115116 return INVALID_PROCESS_ID;
116117}
117118
@@ -212,18 +213,21 @@ bool Elavator::impersonation_system_token(bela::error_code &ec) {
212213 HANDLE hExistingToken = INVALID_HANDLE_VALUE;
213214 auto hProcess = ::OpenProcess (MAXIMUM_ALLOWED, FALSE , systemProcessId);
214215 if (hProcess == INVALID_HANDLE_VALUE) {
215- ec = bela::make_system_error_code (L" Elavator::impersonation_system_token<OpenProcess> " );
216+ ec = bela::make_system_error_code (
217+ bela::StringCat (L" impersonation_system_token OpenProcess (WinLogon - " , systemProcessId, L" ) error: " ));
216218 return false ;
217219 }
218220 auto hpdeleter = bela::finally ([&] { CloseHandle (hProcess); });
219221 if (OpenProcessToken (hProcess, MAXIMUM_ALLOWED, &hExistingToken) != TRUE ) {
220- ec = bela::make_system_error_code (L" Elavator::impersonation_system_token<OpenProcessToken> " );
222+ ec = bela::make_system_error_code (
223+ bela::StringCat (L" impersonation_system_token OpenProcessToken (WinLogon - " , systemProcessId, L" ) error: " ));
221224 return false ;
222225 }
223226 auto htdeleter = bela::finally ([&] { CloseHandle (hExistingToken); });
224227 if (DuplicateTokenEx (hExistingToken, MAXIMUM_ALLOWED, nullptr , SecurityImpersonation, TokenImpersonation, &hToken) !=
225228 TRUE ) {
226- ec = bela::make_system_error_code (L" Elavator::impersonation_system_token<DuplicateTokenEx> " );
229+ ec = bela::make_system_error_code (
230+ bela::StringCat (L" impersonation_system_token DuplicateTokenEx (WinLogon - " , systemProcessId, L" ) error: " ));
227231 return false ;
228232 }
229233 return true ;
@@ -234,8 +238,7 @@ bool Elavator::ImpersonationSystemPrivilege(const privilege_entries *pv, bela::e
234238 if (!EnableSeDebugPrivilege (currentSessionId, ec)) {
235239 return false ;
236240 }
237- if (systemProcessId = LookupSystemProcess (); systemProcessId == INVALID_PROCESS_ID) {
238- ec = bela::make_error_code (1 , L" Elevator::ImpersonationSystemPrivilege unable lookup system process pid" );
241+ if (systemProcessId = LookupSystemProcess (currentSessionId, ec); systemProcessId == INVALID_PROCESS_ID) {
239242 return false ;
240243 }
241244 if (!impersonation_system_token (ec)) {
0 commit comments