C++ CreateMutex在模拟后失败
下面是我试图模拟用户然后创建互斥的代码。未创建互斥锁。我收到错误\访问被拒绝的错误C++ CreateMutex在模拟后失败,c++,windows,mutex,impersonation,C++,Windows,Mutex,Impersonation,下面是我试图模拟用户然后创建互斥的代码。未创建互斥锁。我收到错误\访问被拒绝的错误 void Impersonate() { DWORD logonType = LOGON32_LOGON_INTERACTIVE; DWORD logonProvider = LOGON32_PROVIDER_DEFAULT; HANDLE userToken; HANDLE hMutex; DWORD err; LPSTR user = "zoom"; // t
void Impersonate()
{
DWORD logonType = LOGON32_LOGON_INTERACTIVE;
DWORD logonProvider = LOGON32_PROVIDER_DEFAULT;
HANDLE userToken;
HANDLE hMutex;
DWORD err;
LPSTR user = "zoom"; // the user I created myself on my machine.
// It has Administrator privileges, and my account,
// from which I start the app, is Admin too
LPSTR password = "zoom";
LPSTR domain = ".";
hMutex = NULL;
LogonUserA(user, domain, password, logonType, logonProvider,&userToken);
// just to make sure that mutexes are created fine before impersonation
hMutex = CreateMutexA( NULL, FALSE, "mutex_good" );
ImpersonateLoggedOnUser(userToken);
hMutex = CreateMutexA( NULL, FALSE, "mutex_797" ); // I can set any
// random name, no difference
if( hMutex == NULL )
{
err = GetLastError();
// here err is ERROR_ACCESS_DENIED
}
CloseHandle(userToken);
}
我发现了几个类似的主题,但所有这些主题都在讨论从两个不同的用户上下文创建相同名称的互斥体,即在模拟之前已经创建了互斥体“mutex_1”,并且尝试从模拟用户调用具有相同名称的CreateMutex由于缺乏权限而失败
这里的情况并非如此,因为我非常确定在这段代码之前没有创建具有相同名称的互斥体(或任何互斥体)
我想我应该把一些非null的东西传递到CreateMutex中,但具体是什么呢
我对Windows安全性不是很在行。我理解将NULL作为CreateMutex的第一个参数传递意味着将使用“default”安全属性。在这种情况下,它将是与线程关联的安全参数,即与模拟用户关联的安全参数
我的假设正确吗?首先,您需要了解并使用该工具 这就像内存中的小文件系统,其中包含文件夹和不同的“文件”(此处“文件”下的“文件”表示不同的对象类型-
事件
,变体
(互斥体),部分
,设备
,…)。每次创建命名对象时,都会将其放置到中的某个文件夹中。此处的文件夹(如NTFS中的文件夹)具有安全描述符。因此,并非每个人都可以在任何文件夹下创建对象
要解释您在文件系统语言上所做的操作(可能会更清楚):
我(John
)尝试在%USERPROFILE%\Documents
下创建文件“mutex\u good”,这样就可以了。因为这是我的个人文件夹,我有写权限
然后我以zoom
的身份登录(模拟),并尝试在%USERPROFILE%\Documents
下再次创建文件“mutex\u 797”(%USERPROFILE%
在这两种情况下都扩展到相同的路径,例如c:\Users\John
模拟不影响此操作)
和zoom
无法创建文件。为什么?他根本无权这样做。只有John
,管理员
,系统
有c:\Users\John
的写入权限,但没有zoom
现在让我们回到我们的话题。当我们调用CreateMutexA(NULL,FALSE,“mutex_797”)代码>在哪里?将放置“互斥锁”
如果您没有appcontainer
并且没有在系统会话0
中运行-您在某个用户会话
中运行,您的命名对象将被放置在\Sessions\\BaseNamedObjects
目录中,其中N=1,2
所以调用CreateMutexA(NULL,FALSE,“mutex_797”)代码>
尝试在\Sessions\\BaseNamedObjects\mutex\u 797
但是,在\Sessions\\BaseNamedObjects
中存在下一个符号链接(类似于NTFS文件系统):
也可以在
我们需要DIRECTORY\u CREATE\u OBJECT
access(对DIRECTORY对象的名称创建访问权),以便在目录中创建互斥锁(或事件或任何对象)
现在要了解为什么您可以在\Sessions\\BaseNamedObjects
中创建互斥对象,但zoom
不能创建互斥对象-需要为此文件夹查找安全描述符。我把它扔了:
T FL AcessMsK Sid
0 00 000F000F S-1-5-90-0-1 DWM-1
0 00 000F000F S-1-5-18 SYSTEM
0 0B 10000000 S-1-5-18 SYSTEM
0 0B 10000000 S-1-3-0 CREATOR OWNER
0 00 000F000F S-1-5-21-4026734978-3280735129-2412320105-1001 John
0 0B 10000000 S-1-5-5-0-294807 LogonSessionId_0_294807
0 00 0002000F S-1-5-5-0-294807 LogonSessionId_0_294807
0 00 0002000F S-1-5-32-544 Administrators
0 02 00000003 S-1-1-0 Everyone
0 00 00000002 S-1-5-12 RESTRICTED
17 00 00000001 S-1-16-4096 Low Mandatory Level
那么谁在这里创建了目录对象呢<代码>DWM-1
,系统
,管理员
,当前登录会话用户(LogonSessionId\u 0\u 294807
),当前用户(John
)-以及所有用户<代码>缩放
没有此访问权限
例如,Everyone
have(3)DIRECTORY\u QUERY | DIRECTORY\u transverse-Name lookup
和QUERY
但不Name creation
您可以询问,在这种情况下,在模拟之后,我可以在何处创建互斥?需要使用\BaseNamedObjects
(全局命名空间)或\BaseNamedObjects\Restricted
目录-我测试它的安全描述符和结果:
对于\BaseNamedObjects
T FL AcessMsK Sid
0 00 0002000F S-1-1-0 Everyone
0 00 00000002 S-1-5-12 RESTRICTED
0 00 000F000F S-1-5-90-0-0
0 00 000F000F S-1-5-18 SYSTEM
17 00 00000001 S-1-16-4096 Low Mandatory Level
对于\BaseNamedObjects\Restricted
T FL AcessMsK Sid
0 00 0002000F S-1-1-0 Everyone
0 00 0002000F S-1-5-12 RESTRICTED
0 00 000F000F S-1-5-90-0-0
0 00 000F000F S-1-5-18 SYSTEM
17 00 00000001 S-1-16-4096 Low Mandatory Level
那么您如何查看这里的每个人都有2000F-所有需要的访问权限。希望zoom
是Everyone
的成员?下一个代码我肯定会工作
CreateMutexA(0,0,“全局\\mutex_797”)代码>
对于\BaseNamedObjects
(全局命名空间)存在一个异常:
通过在全局命名空间中创建文件映射对象
使用CreateFileMapping,来自会话零以外的会话是
特权操作。因此,在
任意远程桌面会话主机(RD会话主机)服务器会话
必须启用SeCreateGlobalPrivilege才能创建
已成功在全局命名空间中映射对象。这个
权限检查仅限于创建文件映射对象,
并且不适用于打开现有的。例如,如果一个服务
或者系统创建一个文件映射对象,任何运行在
任何会话都可以访问该文件映射对象,前提是用户
拥有必要的访问权限
但对于互斥或say Event,不需要启用SeCreateGlobalPrivilege
您也可以说,但是zoom
是管理员帐户,Administrator
有权访问\Sessions\\BaseNamedObjects
——那么为什么这不起作用呢?因为使用LOGON32\u LOGON\u INTERACTIVE
和UAC
系统将分配给zoom
过滤令牌<代码>管理员组(S-1-5-32-544
)存在于令牌中,但仅具有属性-因此它忽略SID允许的访问ACE。
和zoom
有另一个LogonSessionId\u 0\u XXX
SID-结果和ERROR\u ACCESS\u DENIED
如前所述@Harry Johnston-如果我们使用L
T FL AcessMsK Sid
0 00 0002000F S-1-1-0 Everyone
0 00 00000002 S-1-5-12 RESTRICTED
0 00 000F000F S-1-5-90-0-0
0 00 000F000F S-1-5-18 SYSTEM
17 00 00000001 S-1-16-4096 Low Mandatory Level
T FL AcessMsK Sid
0 00 0002000F S-1-1-0 Everyone
0 00 0002000F S-1-5-12 RESTRICTED
0 00 000F000F S-1-5-90-0-0
0 00 000F000F S-1-5-18 SYSTEM
17 00 00000001 S-1-16-4096 Low Mandatory Level