我正在研究将证书导入特定本地机器存储所需的最低权限。
我能找到的最好的信息是使用证书,其中写道:
商店受到访问控制列表 (ACL) 的保护,就像计算机上的文件夹一样。
但我找不到任何关于如何修改 ACL 列表的信息店铺我能找到的最好的信息与个人证书有关,但这不是我想要的。
到目前为止,我尝试过通过 MMC 界面查找 UI,并尝试使用Get/Set-Acl
Cmdlet cert:\LocalMachine\WebHosting
。前者没有找到任何结果,后者失败,提示文件夹不支持 ACL。
有什么想法吗?
答案1
事实证明,证书存储主要基于注册表(PK 存储在磁盘上,但不需要特殊访问权限,因此可以忽略),并使用注册表 ACL 进行访问。
本地机器证书都存储在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\
X509Store.Open(ReadWrite)
我还发现,如果未设置,即使使用的本机 API 也会失败,因此无法授予“写入但不能删除”访问权限。
下面是可用于授予“Web Hosting”商店导入证书的访问权限的脚本:
$username = "SomeNonAdminUser"
$acl = Get-Acl HKLM:\SOFTWARE\Microsoft\SystemCertificates\WebHosting
$rule = $acl.Access | ?{ $_.IdentityReference -like "*\$username" }
if ($rule)
{
$rule | %{ $acl.RemoveAccessRule($_) | Out-Null }
}
$rule = New-Object System.Security.AccessControl.RegistryAccessRule `
$username, `
[System.Security.AccessControl.RegistryRights]"CreateSubKey, ReadKey, SetValue, Delete", `
[System.Security.AccessControl.InheritanceFlags]"ContainerInherit, ObjectInherit", `
[System.Security.AccessControl.PropagationFlags]"None", `
"Allow"
$acl.AddAccessRule($rule)
$acl | Set-Acl