我正在尝试编写一个powershell脚本来将证书安装到活动目录证书库中,
以下是手动执行此操作的步骤,非常感谢任何帮助。
在Windows 2008R2域控制器上,
点击开始 - >运行
输入MMC
点击确定
点击文件 - >添加/删除管理单元
选择“证书” - >添加
选择“服务帐户”
单击“下一步”
选择“本地计算机”
单击“下一步”
选择“Active Directory域服务”
单击“完成”
单击确定
我希望脚本将证书安装到:
NTDS \个人
我会发布一张图片但显然没有足够的“声誉”,所以我只能提供文字说明。
基本上我尝试过的是,我使用下面的powershell函数将证书导入本地机器 - >个人商店,大多数证书都在这里,代码可以运行。
但我需要将证书安装到域控制器上的“NTDS \ Personal”存储中,但$ certRootStore只接受localmachine或CurrentUser,所以我卡住了:/
function Import-PfxCertificate
{
param
(
[String]$certPath,
[String]$certRootStore = "localmachine",
[String]$certStore = "My",
$pfxPass = $null
)
$pfx = new-object System.Security.Cryptography.X509Certificates.X509Certificate2
if ($pfxPass -eq $null)
{
$pfxPass = read-host "Password" -assecurestring
}
$pfx.import($certPath,$pfxPass,"Exportable,PersistKeySet")
$store = new-object System.Security.Cryptography.X509Certificates.X509Store($certStore,$certRootStore)
$store.open("MaxAllowed")
$store.add($pfx)
$store.close()
}
Import-PfxCertificate -certPath "d:\Certificate.pfx"
关心Alex
答案 0 :(得分:1)
LocalMachine
和CurrentUser
,正如我们在powershell中看到的那样。
现在,这不是坏消息。我们知道 ADDS服务器上的注册表中存在“物理”位置存储(物理是MS'字,而不是我的),HKLM \ Software \ Microsoft \ Cryptography \ Services \ NTDS \ SystemCertificates。
双重验证了这一点使用mmc管理单元将证书导入商店时使用procmon
#2中的链接显示服务的所有实体存储都存储在上述路径中,用NTDS代替。 真实的服务名称,而不是显示名称。
然而,
因为坏消息。试图用powershell映射它作为根目录,-PSProvider Certificate
将会令人失望,这是我尝试的第一件事。
可以尝试的是使用X509Store构造函数,它将IntPtr带到SystemStore,as described here。是的,这会调用一些非托管代码,混合这两个代码是我很少做的事情,但是this和谷歌搜索 HCERTSTORE C#会让你到那里。
答案 1 :(得分:0)
结合使用以上内容和两个证书的注册表项来存储此文件。
唯一的另一件事是,当证书存储中有多个证书时,我不知道NTDS如何确定要使用哪个证书。
function Import-NTDSCertificate {
[CmdletBinding()]
param(
[Parameter(Mandatory)]
[string]$PFXFile,
[Parameter(Mandatory)]
[string]$PFXPassword,
#Remove certificate from LocalMachine\Personal certificate store
[switch]$Cleanup
)
begin{
Write-Verbose -Message "Importing PFX file."
$PFXObject = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2
$PFXObject.Import($PFXFile,$PFXPassword,[System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)
$thumbprint = $PFXObject.Thumbprint
}
process{
Write-Verbose -Message "Importing certificate into LocalMachine\Personal"
$certificateStore = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Store('My','LocalMachine')
$certificateStore.Open('MaxAllowed')
$certificateStore.Add($PFXObject)
$certificateStore.Close()
Write-Verbose -Message "Copying certificate from LocalMachine\Personal to NTDS\Personal"
$copyParameters = @{
'Path' = "HKLM:\Software\Microsoft\SystemCertificates\MY\Certificates\$thumbprint"
'Destination' = "HKLM:\SOFTWARE\Microsoft\Cryptography\Services\NTDS\SystemCertificates\My\Certificates\$thumbprint"
'Recurse' = $true
}
Copy-Item @copyParameters
}
end{
if ($Cleanup){
Write-Verbose -Message "Removing certificate from LocalMachine\Personal"
$removalParameters = @{
'Path' = "HKLM:\SOFTWARE\Microsoft\SystemCertificates\MY\Certificates\$thumbprint"
'Recurse' = $true
}
Remove-Item @removalParameters
}
}
}
答案 2 :(得分:0)
尽管该帖子已有多年历史,但它仍然很有帮助并且会出现在搜索中,因此,请解决以下问题:“当证书存储区中存在多个证书时,我不知道NTDS如何确定要使用哪个证书”,答案是,当安装了两个或多个符合要求条件的有效证书时,您将得到不可靠的结果,因此建议删除旧的/不需要的证书,而仅将最新/最好的证书留给服务器进行身份验证。