Windows 7 创建启用FS虚拟化的流程

Windows 7 创建启用FS虚拟化的流程,windows-7,windows-vista,uac,createprocessasuser,Windows 7,Windows Vista,Uac,Createprocessasuser,禁用UAC时,我需要创建一个与启用UAC时创建的流程具有相同特征的流程-基本上,我是在模拟启用UAC时的流程创建 我唯一的障碍是虚拟化。下面的示例代码应该在medium IL上创建一个启用虚拟化的notedpad实例。实际上,它在medium IL上创建了一个禁用虚拟化的记事本实例。我不完全确定为什么会忽略虚拟化令牌。有什么想法吗 BOOL bRet; HANDLE hToken; HANDLE hNewToken; // Notepad is used as an example WCHAR

禁用UAC时,我需要创建一个与启用UAC时创建的流程具有相同特征的流程-基本上,我是在模拟启用UAC时的流程创建

我唯一的障碍是虚拟化。下面的示例代码应该在medium IL上创建一个启用虚拟化的notedpad实例。实际上,它在medium IL上创建了一个禁用虚拟化的记事本实例。我不完全确定为什么会忽略虚拟化令牌。有什么想法吗

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);
}

所以,我的做法是错误的——fs虚拟化不是我想要的。要模拟UAC,如上所述,有必要在禁用administrators组的情况下创建受限令牌,并使用该令牌创建流程。

这不起作用的原因,启用虚拟化的
SetTokenInformation
调用正在为
CreateProcessAsUser
创建的主令牌上工作。需要的是实际进程的访问令牌。这可以通过使用
CreationFlag
CREATE\u SUSPENDED
创建进程,并使用
ProcInfo
中的进程句柄调用
OpenProcessToken
来实现。在该令牌上使用
SetTokenInformation
启用虚拟化,然后使用
ResumeThread
运行流程。

虚拟化不是UAC的一项功能吗?我不认为没有UAC就可以实现虚拟化。