Domanda

Con UAC disabili, ho bisogno di creare un processo con le stesse caratteristiche come il processo creato con UAC abilitato -. Fondamentalmente sto emulando la creazione di processo con UAC abilitato

Il mio unico ostacolo è la virtualizzazione. Il codice di esempio deve creare un'istanza di notedpad a media IL con virtualizzazione abilitata. In realtà, si crea un'istanza di blocco note a media IL con la virtualizzazione disabilitato. Non sono del tutto sicuro perché il token di virtualizzazione viene ignorato. Tutte le idee?

BOOL bRet;
HANDLE hToken;
HANDLE hNewToken;

// Notepad is used as an example
WCHAR wszProcessName[MAX_PATH] =
L"C:\\Windows\\System32\\Notepad.exe";

// Medium integrity SID
WCHAR wszIntegritySid[20] = L"S-1-16-8192";
PSID pIntegritySid = NULL;

DWORD EnableVirtualization = 1;
TOKEN_MANDATORY_LABEL TIL = {0};
PROCESS_INFORMATION ProcInfo = {0};
STARTUPINFO StartupInfo = {0};
ULONG ExitCode = 0;

if (OpenProcessToken(GetCurrentProcess(),MAXIMUM_ALLOWED, &hToken))
{
   if (DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL,
      SecurityImpersonation, TokenPrimary, &hNewToken))
   {
      if (ConvertStringSidToSid(wszIntegritySid, &pIntegritySid))
      {
         TIL.Label.Attributes = SE_GROUP_INTEGRITY;
         TIL.Label.Sid = pIntegritySid;

         // Set the process integrity level
         if (SetTokenInformation(hNewToken, TokenIntegrityLevel, &TIL,
            sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(pIntegritySid)))
         {
            // Enable FS Virtualization
            if (SetTokenInformation(hNewToken, TokenVirtualizationEnabled,
               &EnableVirtualization, sizeof(EnableVirtualization)))
            {
               // Create the new process at Low integrity
               bRet = CreateProcessAsUser(hNewToken, NULL,
                  wszProcessName, NULL, NULL, FALSE,
                  0, NULL, NULL, &StartupInfo, &ProcInfo);
            }
         }
         LocalFree(pIntegritySid);
      }
      CloseHandle(hNewToken);
   }
   CloseHandle(hToken);
}
È stato utile?

Soluzione

Quindi, mi stavo avvicinando questo modo non corretto - fs virtualizzazione non è quello che voglio. Per emulare UAC, come sopra descritto, il suo necessario creare un ristretto token con il gruppo amministratori disabili e utilizzare quel segno per creare il processo.

Altri suggerimenti

Il motivo per cui questo non funziona, è che la chiamata SetTokenInformation per accendere la virtualizzazione sta lavorando sul token primario creata per CreateProcessAsUser. Ciò che serve è un token di accesso per il processo vero e proprio. Questo può essere ottenuto creando il processo con il CreationFlag CREATE_SUSPENDED, e chiamando OpenProcessToken con il manico processo da ProcInfo. Usa SetTokenInformation su quella pedina per abilitare la virtualizzazione, e quindi ResumeThread per eseguire il processo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top