我们同样不是以 Admin 登录的为啥不一样?
按照我的粗鄙理解:
Logon之后,用户被授予了一个Token,参照"Access Control Model"。每个进程复制了这个Token (钥匙的概念),而 Object是(锁的概念)记录了哪些Token可以访问之。这个机制与 Linux中的 uid, gid, sgid 与 文件的 -rwxrwxrwx 类似。但Windows的复杂得多。
参照 流传很广的进程提升权限 OpenProcessToken + LookupPrivilegeValue + AdjustTokenPrivileges
https://blog.csdn.net/yockie/article/details/17029293
一直不理解提升权限是啥机制,难道一个guest用户写个代码就能有Admin 同样的power???
我的猜想是进程默认被User X创建出来的时候,仅管X拥有强力的操作权限, 安全起见,许多权限都默认被**自我限制**了,以防止作出意料之外的事情。 而提升权限就是自我解锁令牌限制的声明,声明 SE_DEBUG_NAME之后,表示我这个程序就是用来调试某些进程的,同时未**显式**声明解锁的功能还是不能用。 但是如果 X 本身就没有权限的话,声明解锁也没用(返回失败)。
联系之前的情况,产生的问题如下:
0. 上述理解有没有问题?
1. OpenSCManager, SCManager是否是一个Security Object??? 需要 哪个 SE_xxx_NAME 打开?
2. Run as Admin 到底是什么原理? sudo + UID SID GID 这些概念都清楚, sudo 都需要root密码,但是我们Run as admin 凭什么不需要密码。。。
3. 为何我们同样不Run as Admin 我能成功,我同事失败。
4. 我想开启 LoadDriver 权限。
LookupPrivilegeValue(NULL, SE_LOAD_DRIVER_NAME, &tp.Privileges[0].Luid);
tp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
结果我同事机器上返回 1300 (
Error:1300 Not all privileges or groups referenced are assigned to the caller
),我机器没问题,怎么回事?
众位大神有谁能帮忙梳理一下这方面的知识?