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

时间:2015-05-14 12:04:09

标签: c++ winapi privileges messages

您好,

我正在尝试在位于不同桌面上的应用程序之间发送消息。为了实现这一目标,我使用BSM_ALLDESKTOPS使用LPDWORD lpdwRecipients设置BSM_ALLDESKTOPS参数。

正如MSDN文档所说,ERROR_NOT_ALL_ASSIGNED - 向所有桌面广播。需要SE_TCB_NAME权限。

为了满足这一要求,我发现以下示例在最后一个if语句中生成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);

可能错误是由我调用此函数的方式引起的:

1300

P.S。我已经尝试从提升的提示符运行此应用程序,但结果是相同的,var bmp = Bitmap.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg"); using (var gr = Graphics.FromImage(bmp)) { gr.FillRectangle(Brushes.Black, 50, 50, 200, 200); } 错误代码。

1 个答案:

答案 0 :(得分:1)

此错误代码表示当前Windows用户不允许使用此权限(这就是为什么这些权限毕竟是:不是每个人都拥有它们)。 It is possible to grant a user such privilege,但我强烈建议反对它。相反,您应该使用其他形式的进程间通信。如果您只需要没有数据的信号,那么命名事件应该是好的。否则,它可能是命名管道,套接字或共享内存部分。