【发布时间】:2013-12-31 06:20:15
【问题描述】:
我有一个将 pfx 证书安装到 LocalMachine 证书存储区的 PowerShell 脚本。函数如下所示:
function Add-Certificate {
param
(
[Parameter(Position=1, Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string]$pfxPath,
[Parameter(Position=2, Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string]$pfxPassword
)
Write-Host "Installing certificate" -ForegroundColor Yellow
try
{
$pfxcert = new-object system.security.cryptography.x509certificates.x509certificate2
$pfxcert.Import($pfxPath, $pfxPassword, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]"PersistKeySet")
$store = new-object system.security.cryptography.X509Certificates.X509Store -argumentlist "MY", LocalMachine
$store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]"ReadWrite");
$store.Add($pfxcert);
$store.Close();
return $pfxcert
}
catch
{
throw
}
}
当我打开证书管理器以验证安装时,我可以看到它已正确安装。
我的流程的下一步是将证书的权限分配给服务帐户。
function Set-CertificatePermission
{
param
(
[Parameter(Position=1, Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string]$pfxThumbPrint,
[Parameter(Position=2, Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string]$serviceAccount
)
$cert = Get-ChildItem -Path cert:\LocalMachine\My | Where-Object -FilterScript { $PSItem.ThumbPrint -eq $pfxThumbPrint; };
# Specify the user, the permissions and the permission type
$permission = "$($serviceAccount)","Read,FullControl","Allow"
$accessRule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $permission;
# Location of the machine related keys
$keyPath = $env:ProgramData + "\Microsoft\Crypto\RSA\MachineKeys\";
$keyName = $cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName;
$keyFullPath = $keyPath + $keyName;
try
{
# Get the current acl of the private key
# This is the line that fails!
$acl = Get-Acl -Path $keyFullPath;
# Add the new ace to the acl of the private key
$acl.AddAccessRule($accessRule);
# Write back the new acl
Set-Acl -Path $keyFullPath -AclObject $acl;
}
catch
{
throw $_;
}
}
此功能失败。具体来说,此函数在尝试评估 Get-Acl 命令时失败,并出现以下错误:Get-Acl : Cannot find path 'C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\59f1e969a4f7e5de90224f68bc9be536_1d508f5e-0cbc-4eca- a402-3e55947faa3b'
事实证明,密钥文件已安装到我的漫游配置文件中C:\Users\MyUserName\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-1259098847-1967870486-1845911597 -155499
我确定 Add-Certificate 功能有问题,但我无法弄清楚它是什么。如何强制它在 C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys 目录下安装密钥文件?
【问题讨论】:
-
仅供参考,我知道这并不能解决主题,但
try .. catch语句只会捕获 PowerShell 中的终止错误。大多数 cmdlet 会生成非终止错误,因此要将它们更改为终止错误,请使用Get-Acl上的-ErrorAction参数并将值设置为Stop。 -
谢谢@TrevorSullivan,我会立即做出改变。
-
不客气。顺便说一句,您不使用
Import-PfxCertificatecmdlet 是否有原因? -
@TrevorSullivan 据我所知,这仅在 Windows 2012 中可用。
-
您运行的是哪个版本的 Windows 和 PowerShell?
标签: powershell permissions pfx