我可以将TokenPrivileges数组从一台计算机复制到另一台计算机吗
Can I copy TokenPrivileges array from one computer to another?
我正在编写一个日志记录服务,它可以收集进程的权限,以便将其传输到另一台计算机。我使用以下代码来收集它:
HANDLE hToken;
if(OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &hToken))
{
DWORD dwSize = 0;
if(!GetTokenInformation(hToken, TokenPrivileges, NULL, dwSize, &dwSize) &&
::GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
BYTE* pb = new (std::nothrow) BYTE[dwSize];
if(pb)
{
TOKEN_PRIVILEGES* pTPs = (TOKEN_PRIVILEGES*)pb;
DWORD dwSize2;
if(GetTokenInformation(hToken, TokenPrivileges, pTPs, dwSize, &dwSize2) &&
dwSize2 <= dwSize)
{
//Got our BYTE array in 'pb' of size 'dwSize2' bytes
memcpy(pByteArrayToTransmit, pb, dwSize2);
}
delete[] pb;
}
}
CloseHandle(hToken);
}
但我很好奇,我是否可以将pByteArrayToTransmit
数组传递给另一台Windows计算机,并能够使用LookupPrivilegeName API将其转换为可读形式?
PS。我不在客户端机器(记录数据的地方)上调用LookupPrivilegeName
的原因是为了节省记录数据的大小,因为这个过程可能会重复很多次。
LookupPrivilegeValue:的文档
LookupPrivilegeValue函数检索在指定系统上用于本地表示指定特权名称的本地唯一标识符(LUID)。
这有力地表明,每个系统的LUID是不同的。至少,不能保证它们会是一样的。
附录
假设日志记录系统不一定必须在所有可能的情况下工作,并且假设日志将在软件中进行分析,并且每次新版本的Windows出现时都可以更新分析软件,并且日志还包括Windows版本,正如Eryksun在评论中所建议的那样,将这些信息压缩成单个64位位图应该足够安全。
如果你想尽可能安全地播放,我建议你在位图后面加一个可选的可变长度字段。您可以有一个固定的字符串表(我们所知道的每个特权名称都有一个),每个字符串的位图中都有一位。如果您看到的所有特权名称都在表中,则位图就是您所需要的。
如果您看到一个或多个不知道的特权名称,请设置位图中的最高位以指示有更多数据,然后添加一个或更多以null结尾的字符串,并在末尾添加一个额外的null以指示列表的末尾。
是的,你可以这样做。特权值是不变的。
#define SE_MIN_WELL_KNOWN_PRIVILEGE (2L)
#define SE_CREATE_TOKEN_PRIVILEGE (2L)
#define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE (3L)
#define SE_LOCK_MEMORY_PRIVILEGE (4L)
#define SE_INCREASE_QUOTA_PRIVILEGE (5L)
#define SE_MACHINE_ACCOUNT_PRIVILEGE (6L)
#define SE_TCB_PRIVILEGE (7L)
#define SE_SECURITY_PRIVILEGE (8L)
#define SE_TAKE_OWNERSHIP_PRIVILEGE (9L)
#define SE_LOAD_DRIVER_PRIVILEGE (10L)
#define SE_SYSTEM_PROFILE_PRIVILEGE (11L)
#define SE_SYSTEMTIME_PRIVILEGE (12L)
#define SE_PROF_SINGLE_PROCESS_PRIVILEGE (13L)
#define SE_INC_BASE_PRIORITY_PRIVILEGE (14L)
#define SE_CREATE_PAGEFILE_PRIVILEGE (15L)
#define SE_CREATE_PERMANENT_PRIVILEGE (16L)
#define SE_BACKUP_PRIVILEGE (17L)
#define SE_RESTORE_PRIVILEGE (18L)
#define SE_SHUTDOWN_PRIVILEGE (19L)
#define SE_DEBUG_PRIVILEGE (20L)
#define SE_AUDIT_PRIVILEGE (21L)
#define SE_SYSTEM_ENVIRONMENT_PRIVILEGE (22L)
#define SE_CHANGE_NOTIFY_PRIVILEGE (23L)
#define SE_REMOTE_SHUTDOWN_PRIVILEGE (24L)
#define SE_UNDOCK_PRIVILEGE (25L)
#define SE_SYNC_AGENT_PRIVILEGE (26L)
#define SE_ENABLE_DELEGATION_PRIVILEGE (27L)
#define SE_MANAGE_VOLUME_PRIVILEGE (28L)
#define SE_IMPERSONATE_PRIVILEGE (29L)
#define SE_CREATE_GLOBAL_PRIVILEGE (30L)
#define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE (31L)
#define SE_RELABEL_PRIVILEGE (32L)
#define SE_INC_WORKING_SET_PRIVILEGE (33L)
#define SE_TIME_ZONE_PRIVILEGE (34L)
#define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE (35L)
#define SE_MAX_WELL_KNOWN_PRIVILEGE (SE_CREATE_SYMBOLIC_LINK_PRIVILEGE)
相关文章:
- 我的 SDL2 程序需要哪些二进制文件,以便它在另一台未安装 SDL2 的计算机中工作
- 在另一台 PC 上执行程序时加载 SDL2 共享库时出错
- 另一台电脑上的Visual Studio C++项目无法生成
- Homebrew OS X OpenCV - 在另一台Mac上运行时寻找dylib
- 当我在支持 avx2 的机器上编译并在另一台仅支持 avx 的机器上运行二进制文件时会发生什么?
- 如何在另一台未安装 Visual Studio 的计算机中使用由 Visual Studio 生成的 dll
- 在另一台计算机中运行 GTKMM 代码时未定义的符号
- 将Visual Studio C 构建的中间文件移至另一台计算机
- 为什么我的Glreadpixels程序在另一台计算机中不起作用
- 在另一台计算机MFC C++上不进入while循环
- 我可以将TokenPrivileges数组从一台计算机复制到另一台计算机吗
- 从另一台计算机运行opencv可执行文件
- 通过网络直接从另一台计算机的内存中读取文件
- fwrite在一台计算机上浮动,在另一台计算机中浮动
- 在C++中使用 zeromq 将序列化的 Mat 对象发送到另一台计算机
- 一台计算机中出现 msvs 2013 错误 C2057,另一台计算机中没有错误。这是怎么回事?
- 使用蓝牙将陀螺仪数据传输到另一台计算机
- 使用脉冲编码调制从一台计算机到另一台计算机的数据传输
- 如何在另一台计算机(linux)上使用OpenCV运行c++库
- 在局域网上选择一台计算机作为服务器