Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何降低从系统服务启动的用户进程的权限?_C++_Windows_Winapi_Kernel32 - Fatal编程技术网

C++ 如何降低从系统服务启动的用户进程的权限?

C++ 如何降低从系统服务启动的用户进程的权限?,c++,windows,winapi,kernel32,C++,Windows,Winapi,Kernel32,在我的本地系统服务中,我可以启动一个UI进程,该进程应使用登录的Windows用户的凭据运行,但有时,当没有登录的用户时,它也应该能够在Winlogon或“安全桌面”中启动 因此,我使用以下构造为其准备用户令牌: //The following pseudo-code snippet is run from the local system service HANDLE hSelfToken = NULL; HANDLE hToken2 = NULL; ::OpenProcessToken(

在我的本地系统服务中,我可以启动一个UI进程,该进程应使用登录的Windows用户的凭据运行,但有时,当没有登录的用户时,它也应该能够在
Winlogon
或“安全桌面”中启动

因此,我使用以下构造为其准备用户令牌:

//The following pseudo-code snippet is run from the local system service

HANDLE hSelfToken = NULL;
HANDLE hToken2 = NULL;

::OpenProcessToken(::GetCurrentProcess(), TOKEN_ALL_ACCESS, &hSelfToken);

//Remove most of privileges & create restricted token
::CreateRestrictedToken(hSelfToken, 
            DISABLE_MAX_PRIVILEGE | LUA_TOKEN,
            0, NULL,
            0, NULL, 0, NULL,
            &hToken2);

//Set user session ID for the token where the process will run
::SetTokenInformation(hToken2, TokenSessionId, &dwSessionId, sizeof(dwSessionId));

//The 'hToken2' is later used to call CreateProcessAsUser() to start a user UI process
这非常有效,除了在几乎没有提升的情况下,使用此方法启动的我的UI进程仍然会收到太多系统服务的“权限”。例如,它可以在
C:\
根文件夹中创建文件,或者打开
HKLM
注册表项进行写入


所以我很好奇,我还应该做些什么来降低子进程的权限?

最好不要将访问权限描述为“特权”,因为这个词在Windows访问控制上下文中有特定的含义。我怀疑
LUA_令牌
标志设置了新令牌的提升类型,但这本身并不影响令牌的访问权限。我演示了“提升的”令牌不一定启用Administrators组,我认为您做了相反的事情-创建了一个具有“受限”提升类型但属于Administrators组的令牌。CreateRestrictedToken()允许您指定限制SID的列表,这可能是最安全的方法。但是您可以禁用您不想要的那些SID,即至少是管理员和系统,因为它们都出现在C:\和HKLM的DACL中。但是,我不确定在仍然能够在目标桌面上显示GUI的情况下是否有任何方法可以做到这一点。您正在基于服务本身作为(系统?)运行的用户的令牌,而不是登录到您将在其上运行新进程的目标会话的用户的令牌,创建一个受限令牌。用于获取目标会话用户的令牌(如果有)。@HarryJohnston:非常感谢!参考您的建议:
LUA_令牌
flag实际上会从令牌中删除高程。为CreateRestrictedToken添加管理组SID(我通过执行
ConvertStringSidToSid(L“S-1-5-32-544”,&pSidAdminGroup)
)作为
SidsToDisable
参数并不会改变我可能注意到的任何内容。如果我将
系统
SID添加到拒绝列表(我从
ConvertStringSidToSid(L“S-1-5-18,&pSidSYSTEM)
)中获得)中,它会使
CreateProcessAsUser
失败,并导致
错误访问被拒绝
。因此,到目前为止没有运气……最好不要将访问权限描述为“特权”,因为该词在Windows访问控制上下文中具有特定的含义。我怀疑
LUA_令牌
标志设置了新令牌的提升类型,但其本身并不影响令牌的访问权限。我演示了“提升的”令牌不一定启用Administrators组,我认为您做了相反的事情-创建了一个具有“受限”提升类型但属于Administrators组的令牌。CreateRestrictedToken()允许您指定限制SID的列表,这可能是最安全的方法。但是您可以禁用您不想要的那些SID,即至少是管理员和系统,因为它们都出现在C:\和HKLM的DACL中。但是,我不确定在仍然能够在目标桌面上显示GUI的情况下是否有任何方法可以做到这一点。您正在基于服务本身作为(系统?)运行的用户的令牌,而不是登录到您将在其上运行新进程的目标会话的用户的令牌,创建一个受限令牌。用于获取目标会话用户的令牌(如果有)。@HarryJohnston:非常感谢!参考您的建议:
LUA_令牌
flag实际上会从令牌中删除高程。为CreateRestrictedToken添加管理组SID(我通过执行
ConvertStringSidToSid(L“S-1-5-32-544”,&pSidAdminGroup)
)作为
SidsToDisable
参数并不会改变我可能注意到的任何内容。如果我将
系统
SID添加到拒绝列表(我从
ConvertStringSidToSid(L“S-1-5-18,&pSidSYSTEM)
)中获得)中,它会使
CreateProcessAsUser
失败,并导致
错误访问被拒绝
。所以到目前为止没有运气。。。