我可以将 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 [=22= 将其转换为可读形式]?

PS。我没有在客户端机器(记录数据的地方)上调用 LookupPrivilegeName 的原因是为了节省记录数据的大小,因为这个过程可能会重复很多次。

来自documentation for LookupPrivilegeValue

The LookupPrivilegeValue function retrieves the locally unique identifier (LUID) used on a specified system to locally represent the specified privilege name.

这强烈表明每个系统上的 LUID 都不同。至少,不能保证它们是一样的。

附录

假设日志系统不一定要在所有可能的情况下工作,并假设日志将在软件中进行分析,并且您可以在每次新版本 Windows 时更新分析软件出来了,并且假设日志还包括 Windows 版本,按照 Eryksun 在评论中建议的那样将此信息压缩到单个 64 位位图中应该足够安全。

如果您想尽可能安全地使用它,我建议使用位图,后跟一个可选的可变长度字段。您可以有一个固定的 table 字符串(一个对应我们知道的每个特权名称),每个字符串在位图中有一位。如果您看到的所有权限名称都在 table 中,那么位图就是您所需要的。

如果您看到一个或多个您不知道的特权名称,请设置位图中的最高位以指示还有更多数据,然后添加一个或多个以 null 结尾的字符串,并在end 表示列表结束。

是的,你可以做到。特权值是不变的。

#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)