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

时间:2015-04-02 04:00:53

标签: c++ windows winapi

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

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的原因是节省了记录数据的大小,因为这个过程可能重复多次。

2 个答案:

答案 0 :(得分:3)

来自documentation for LookupPrivilegeValue

  

LookupPrivilegeValue函数检索在指定系统上使用的本地唯一标识符(LUID),以在本地表示指定的权限名称。

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

附录

假设日志系统并非绝对必须在所有可能的环境下工作,并假设日志将在软件中进行分析,并且每次新版本的Windows出现时都可以更新分析软件,并提供日志还包括Windows版本,它应该足够安全,可以将这些信息压缩为单个64位位图,正如Eryksun在评论中所建议的那样。

如果你想尽可能安全地播放它,我建议使用一个位图,然后是一个可选的可变长度字段。您可以拥有一个固定的字符串表(我们知道的每个权限名称一个),每个字符串的位图中有一位。如果您看到的所有权限名称都在表中,则只需要位图。

如果您看到一个或多个您不知道的权限名称,请设置位图中的顶部位以指示存在更多数据,然后添加一个或多个以空值终止的字符串,并在结尾表示清单的结尾。

答案 1 :(得分:0)

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

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