设置跨多个桌面广播消息的权限
Setting permissions to broadcast messages across multiple desktops
您好,
我正在尝试在位于不同桌面上的应用程序之间发送消息。为了实现这一点,我使用 BroadCastSystemMessage 使用 BSM_ALLDESKTOPS
设置 LPDWORD lpdwRecipients
参数。
如 MSDN 文档所述,BSM_ALLDESKTOPS
- 广播到所有桌面。需要 SE_TCB_NAME 权限。
为了满足这个要求,我找到了下面的示例,它在最后一个 if 语句中生成 ERROR_NOT_ALL_ASSIGNED
,代码为 1300 - Not all privileges or groups referenced are assigned to the caller
:
BOOL GrantPrivilege::SetPrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
{
TOKEN_PRIVILEGES tp;
LUID luid;
if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid))
{
printf("LookupPrivilegeValue error: %u\n", GetLastError());
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;
// Enable the privilege or disable all privileges.
if (!AdjustTokenPrivileges(
hToken,
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES)NULL,
(PDWORD)NULL))
{
printf("AdjustTokenPrivileges error: %u\n", GetLastError());
return FALSE;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{
printf("The token does not have the specified privilege. %u\n ", GetLastError());
return FALSE;
}
return TRUE;
}
错误可能是我调用此函数的方式引起的:
HANDLE hToken;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
printf("%u", GetLastError());
GrantPrivilege gPriv;
gPriv.SetPrivilege(hToken, L"SeTcbPrivilege", true);
P.S. 我试过从提升的提示符运行这个应用程序,但结果是一样的,1300
错误代码。
这个错误代码意味着当前windows用户不允许使用这个权限(这就是为什么这些是权限,毕竟:不是每个人都有)。 It is possible to grant a user such privilege,但我强烈反对。相反,您应该使用某种其他形式的进程间通信。如果你只需要一个没有数据的信号,命名事件应该是好的。否则,它可能是命名管道、套接字或共享内存部分。
您好,
我正在尝试在位于不同桌面上的应用程序之间发送消息。为了实现这一点,我使用 BroadCastSystemMessage 使用 BSM_ALLDESKTOPS
设置 LPDWORD lpdwRecipients
参数。
如 MSDN 文档所述,BSM_ALLDESKTOPS
- 广播到所有桌面。需要 SE_TCB_NAME 权限。
为了满足这个要求,我找到了下面的示例,它在最后一个 if 语句中生成 ERROR_NOT_ALL_ASSIGNED
,代码为 1300 - Not all privileges or groups referenced are assigned to the caller
:
BOOL GrantPrivilege::SetPrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
{
TOKEN_PRIVILEGES tp;
LUID luid;
if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid))
{
printf("LookupPrivilegeValue error: %u\n", GetLastError());
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;
// Enable the privilege or disable all privileges.
if (!AdjustTokenPrivileges(
hToken,
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES)NULL,
(PDWORD)NULL))
{
printf("AdjustTokenPrivileges error: %u\n", GetLastError());
return FALSE;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{
printf("The token does not have the specified privilege. %u\n ", GetLastError());
return FALSE;
}
return TRUE;
}
错误可能是我调用此函数的方式引起的:
HANDLE hToken;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
printf("%u", GetLastError());
GrantPrivilege gPriv;
gPriv.SetPrivilege(hToken, L"SeTcbPrivilege", true);
P.S. 我试过从提升的提示符运行这个应用程序,但结果是一样的,1300
错误代码。
这个错误代码意味着当前windows用户不允许使用这个权限(这就是为什么这些是权限,毕竟:不是每个人都有)。 It is possible to grant a user such privilege,但我强烈反对。相反,您应该使用某种其他形式的进程间通信。如果你只需要一个没有数据的信号,命名事件应该是好的。否则,它可能是命名管道、套接字或共享内存部分。