设置跨多个桌面广播消息的权限

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,但我强烈反对。相反,您应该使用某种其他形式的进程间通信。如果你只需要一个没有数据的信号,命名事件应该是好的。否则,它可能是命名管道、套接字或共享内存部分。