我家里有几台电脑需要管理。它们大多数运行 Windows 7,我们依靠它们之间的点对点共享。所有系统上的所有帐户都存在且密码匹配(我们不使用家庭组)。
到目前为止,我一直使用属于管理员组成员的帐户,但出于安全目的,我想摆脱这种帐户,因此我有一个系统,其中我的帐户(实验性地)不在管理员组中。
我刚刚完成了最近一次与证书的较量(针对我编写的代码签名软件,特别是 Excel 宏),并对 MMC 证书管理单元做出了一些我无法解释的观察。通常,我运行 MMC 并请求提升,我添加管理单元两次,一次用于我的帐户证书,一次用于系统证书。
第一个观察结果是,系统存储中的任何证书在用户相应的存储中也是可见的,这是我很久以前注意到的。由于没有更好的术语,我将这种影响称为投影。它似乎至少发生在受信任的发布者和受信任的根证书颁发机构存储中,但显然不会发生在个人存储中。据我所知,无法判断管理单元显示的证书实际上是在用户存储中还是从系统存储中投影而来的。
第二个观察结果是,从非管理员帐户启动时,MMC 没有 UAC 提示,我仅有的可以添加我自己的证书的管理单元。投影的系统级证书仍显示在列表中,但删除操作不可用(它甚至不在上下文菜单中)。这有点道理,并提供了一种间接的方式来确定它是否真的是我自己的证书之一,或者只是系统证书的投影。
但是,当从管理员帐户运行 MMC 时,不会发生这种情况;相反,我得到了 UAC 提示,并且可以选择我的帐户、系统帐户或服务帐户来添加管理单元。在这种情况下,删除操作适用于似乎位于我的用户级存储中的所有证书,如果证书恰好位于系统存储中,则删除操作无论如何都会起作用,这通常是人们不想要的。为了避免意外删除重要内容,从管理员帐户以非管理员模式运行 MMC 似乎并不容易。
我的问题是:
- 当 MMC 以管理员身份运行时,有没有什么方法可以确定用户级存储中看到的证书是否实际存储在那里,而不是系统级存储中的证书的投影?
- 有没有办法,当登录到管理员帐户时,以非管理员身份运行 MMC 及其证书管理单元,以便不会意外删除系统级证书?事实证明,有一些笨拙的方法可以做到这一点:此方法向上下文菜单添加一个新动词,也许有更好的方法,不会暂时显示 CMD 窗口。
我将在这里继续调查。
到目前为止,MMC 管理单元和cert:
PowerShell 中的驱动器容器对象显示了投影的证书。certutil -store
并且certutil -viewstore
不显示投影的证书(事实上,在系统受信任的发布者存储中少显示一个证书,这意味着还有另一个存储涉及投影到这个存储中)
这些可能都有记录在某处,但我还没有找到......