我可以将TokenPrivileges数组从一台计算机复制到另一台计算机吗

Can I copy TokenPrivileges array from one computer to another?

本文关键字:一台 计算机 复制 我可以 数组 TokenPrivileges      更新时间:2023-10-16

我正在编写一个日志记录服务,它可以收集进程的权限,以便将其传输到另一台计算机。我使用以下代码来收集它:

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)