我正在尝试使用以下代码修改特定$cert
的访问规则:
$csp = New-Object System.Security.Cryptography.CspParameters (
$cert.PrivateKey.CspKeyContainerInfo.ProviderType,
$cert.PrivateKey.CspKeyContainerInfo.ProviderName,
$cert.PrivateKey.CspKeyContainerInfo.KeyContainerName)
$csp.Flags = [System.Security.Cryptography.CspProviderFlags]::UseExistingKey -bor [System.Security.Cryptography.CspProviderFlags]::UseMachineKeyStore
$csp.CryptoKeySecurity = $cert.PrivateKey.CspKeyContainerInfo.CryptoKeySecurity
$csp.KeyNumber = $cert.PrivateKey.CspKeyContainerInfo.KeyNumber
$access = New-Object System.Security.AccessControl.CryptoKeyAccessRule (
$identity,
[System.Security.AccessControl.CryptoKeyRights]::GenericRead,
[System.Security.AccessControl.AccessControlType]::Allow)
$csp.CryptoKeySecurity.AddAccessRule($access)
但是它在最后一行抛出异常,因为$csp.CryptoKeySecurity
为空。调试时发现$cert.PrivateKey.CspKeyContainerInfo.CryptoKeySecurity
也为null。但是,困难的部分是这仅发生在五分之一的机器上,不依赖于OS版本或PS版本,仅发生在我们的生产环境中,为什么...?仅供参考$cert.PrivateKey
不为空,$cert.PrivateKey.CspKeyContainerInfo
也不为空。
答案 0 :(得分:0)
最后,问题出在我们生产环境中安全设置的不同配置中。在我的机器上,设置Manage auditing and security log
设置为Administrators
,而在服务器上,设置却不同,只是我们的OPS人员。在将代码重写为C#之后发现了这一点,这引发了异常,这与PS不同,后者只是默默地返回null。
该进程不具有此操作所需的“ SeSecurityPrivilege”特权。
有关如何解决此问题的信息,请参见this SO question。