您好,
我正在尝试在位于不同桌面上的应用程序之间发送消息。为了实现这一目标,我使用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);
}
错误代码。
答案 0 :(得分:1)
此错误代码表示当前Windows用户不允许使用此权限(这就是为什么这些权限毕竟是:不是每个人都拥有它们)。 It is possible to grant a user such privilege,但我强烈建议反对它。相反,您应该使用其他形式的进程间通信。如果您只需要没有数据的信号,那么命名事件应该是好的。否则,它可能是命名管道,套接字或共享内存部分。