VirtualBox

Changeset 95180 in vbox for trunk


Ignore:
Timestamp:
Jun 3, 2022 10:05:30 AM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
151679
Message:

VBoxAutostart/win: Added "logon as service" privilege to user during autostart service installation. bugref:9431

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxAutostart/VBoxAutostart-win.cpp

    r95139 r95180  
    3535
    3636#include <iprt/win/windows.h>
     37#include <ntsecapi.h>
    3738
    3839#define SECURITY_WIN32
     
    6263/** The service display name. */
    6364#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
    6472
    6573ComPtr<IVirtualBoxClient> g_pVirtualBoxClient = NULL;
     
    306314    DeregisterEventSource(hEventLog);
    307315}
     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 */
     327static 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
    308430
    309431/**
     
    616738    autostartFormatServiceName(sDomain, sUserTmp, sServiceName);
    617739
     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);
    618744    /*
    619745     * Create the service.
     
    9881114{
    9891115    int vrc;
    990 
     1116RT_BREAKPOINT();
    9911117    LogFlowFuncEnter();
    9921118
     
    13571483    }
    13581484}
    1359 
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette