- Timestamp:
- Jun 3, 2022 10:05:30 AM (3 years ago)
- svn:sync-xref-src-repo-rev:
- 151679
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VBoxAutostart/VBoxAutostart-win.cpp
r95139 r95180 35 35 36 36 #include <iprt/win/windows.h> 37 #include <ntsecapi.h> 37 38 38 39 #define SECURITY_WIN32 … … 62 63 /** The service display name. */ 63 64 #define AUTOSTART_SERVICE_DISPLAY_NAME "VirtualBox Autostart Service" 65 66 /* just define it here instead of including 67 * a bunch of nt headers */ 68 #ifndef STATUS_SUCCESS 69 #define STATUS_SUCCESS ((NTSTATUS)0) 70 #endif 71 64 72 65 73 ComPtr<IVirtualBoxClient> g_pVirtualBoxClient = NULL; … … 306 314 DeregisterEventSource(hEventLog); 307 315 } 316 317 318 /** 319 * Adds "logon as service" policy to user rights 320 * 321 * When this fails, an error message will be displayed. 322 * 323 * @returns VBox status code. 324 * 325 * @param sUser The name of user whom the policy should be added. 326 */ 327 static int autostartUpdatePolicy(const com::Utf8Str &sUser) 328 { 329 LSA_OBJECT_ATTRIBUTES objectAttributes = { 0 }; 330 /* Object attributes are reserved, so initialize to zeros. */ 331 RT_ZERO(objectAttributes); 332 333 int vrc; 334 335 /* Get a handle to the Policy object. */ 336 LSA_HANDLE hPolicy; 337 NTSTATUS ntRc = LsaOpenPolicy( NULL, &objectAttributes, POLICY_ALL_ACCESS, &hPolicy); 338 if (ntRc != STATUS_SUCCESS) 339 { 340 DWORD dwErr = LsaNtStatusToWinError(ntRc); 341 vrc = RTErrConvertFromWin32(dwErr); 342 autostartSvcDisplayError("LsaOpenPolicy failed rc=%Rrc (%#x)\n", vrc, dwErr); 343 return vrc; 344 } 345 /* Get user SID */ 346 DWORD cbDomain = 0; 347 SID_NAME_USE enmSidUse = SidTypeUser; 348 RTUTF16 *pwszUser = NULL; 349 size_t cwUser = 0; 350 vrc = RTStrToUtf16Ex(sUser.c_str(), sUser.length(), &pwszUser, 0, &cwUser); 351 if (RT_SUCCESS(vrc)) 352 { 353 PSID pSid = NULL; 354 DWORD cbSid = 0; 355 if (!LookupAccountNameW( NULL, pwszUser, pSid, &cbSid, NULL, &cbDomain, &enmSidUse)) 356 { 357 DWORD dwErr = GetLastError(); 358 if (dwErr == ERROR_INSUFFICIENT_BUFFER) 359 { 360 pSid = (PSID)RTMemAllocZ(cbSid); 361 if (pSid != NULL) 362 { 363 PRTUTF16 pwszDomain = (PRTUTF16)RTMemAllocZ(cbDomain * sizeof(RTUTF16)); 364 if (pwszDomain != NULL) 365 { 366 if (LookupAccountNameW( NULL, pwszUser, pSid, &cbSid, pwszDomain, &cbDomain, &enmSidUse)) 367 { 368 if (enmSidUse != SidTypeUser) 369 { 370 vrc = VERR_INVALID_PARAMETER; 371 autostartSvcDisplayError("The name %s is not the user\n", sUser.c_str()); 372 } 373 else 374 { 375 /* Add privilege */ 376 LSA_UNICODE_STRING lwsPrivilege; 377 // Create an LSA_UNICODE_STRING for the privilege names. 378 lwsPrivilege.Buffer = L"SeServiceLogonRight"; 379 size_t cwPrivilege = wcslen(lwsPrivilege.Buffer); 380 lwsPrivilege.Length = (USHORT)cwPrivilege * sizeof(WCHAR); 381 lwsPrivilege.MaximumLength = (USHORT)(cwPrivilege + 1) * sizeof(WCHAR); 382 ntRc = LsaAddAccountRights(hPolicy, pSid, &lwsPrivilege, 1); 383 if (ntRc != STATUS_SUCCESS) 384 { 385 dwErr = LsaNtStatusToWinError(ntRc); 386 vrc = RTErrConvertFromWin32(dwErr); 387 autostartSvcDisplayError("LsaAddAccountRights failed rc=%Rrc (%#x)\n", vrc, dwErr); 388 } 389 } 390 } 391 else 392 { 393 dwErr = GetLastError(); 394 vrc = RTErrConvertFromWin32(dwErr); 395 autostartSvcDisplayError("LookupAccountName failed rc=%Rrc (%#x)\n", vrc, dwErr); 396 } 397 RTMemFree(pwszDomain); 398 } 399 else 400 { 401 vrc = VERR_NO_MEMORY; 402 autostartSvcDisplayError("autostartUpdatePolicy failed rc=%Rrc\n", vrc); 403 } 404 405 RTMemFree(pSid); 406 } 407 else 408 { 409 vrc = VERR_NO_MEMORY; 410 autostartSvcDisplayError("autostartUpdatePolicy failed rc=%Rrc\n", vrc); 411 } 412 } 413 else 414 { 415 vrc = RTErrConvertFromWin32(dwErr); 416 autostartSvcDisplayError("LookupAccountName failed rc=%Rrc (%#x)\n", vrc, dwErr); 417 } 418 } 419 } 420 else 421 autostartSvcDisplayError("Failed to convert user name rc=%Rrc\n", vrc); 422 423 if (pwszUser != NULL) 424 RTUtf16Free(pwszUser); 425 426 LsaClose(hPolicy); 427 return vrc; 428 } 429 308 430 309 431 /** … … 616 738 autostartFormatServiceName(sDomain, sUserTmp, sServiceName); 617 739 740 vrc = autostartUpdatePolicy(sUserFullName); 741 if (RT_FAILURE(vrc)) 742 return autostartSvcDisplayError("Failed to get/update \"logon as service\" policy for user %s (%Rrc)\n", 743 sUserFullName.c_str(), vrc); 618 744 /* 619 745 * Create the service. … … 988 1114 { 989 1115 int vrc; 990 1116 RT_BREAKPOINT(); 991 1117 LogFlowFuncEnter(); 992 1118 … … 1357 1483 } 1358 1484 } 1359
Note:
See TracChangeset
for help on using the changeset viewer.