使用powershell禁用WinRM时,如何将证书导入远程系统上的证书存储区

ilmyapht  于 2023-01-30  发布在  Shell
关注(0)|答案(1)|浏览(151)

当出于安全原因在环境中禁用WinRM时,如何使用Powershell将证书导入远程系统上的证书存储区。我尝试了一些变通方法,但都失败了。请放心,我是新手。
我已经尝试过这个作为一个工作周围,是的,我知道它的不可信的商店。

$cert = getchilditem -path "SharePath.cer"
$server = Get-content ".\servers.txt"
$server | foreach { $cert | import-certificate -CertStoreLocation Cert:LocalMachine\Disallowed
kyks70gy

kyks70gy1#

将证书部署到计算机可能最好通过Group Policy来完成,因为它是一个更加健壮和易于使用的过程。
也就是说,如果您不能使用组策略,您可以根据目标系统的操作系统使用其他几种解决方案中的一种。
Boe Prox wrote an Import-Certificate函数和说明,在幕后使用.Net允许在没有WinRM或早于Windows 10的远程计算机上导入。使用他的解决方案,您可以执行以下操作:

$File = "C:\temp\SomeRootCA.cer"    
$Computername = 'Server1','Server2','Client1','Client2'    
Import-Certificate -Certificate $File -StoreName Disallowed -StoreLocation LocalMachine -ComputerName $Computername

如果你使用的是Windows 10,你可以使用内置的Import-Certificate,但这只适用于本地系统,所以你需要用Invoke-Command Package 它(这需要WinRM),或者您可以回退到Invoke-WMIMethod。使用或处理输出时,它几乎没有那么友好,但它会起作用。这是一个在没有WinRM的远程计算机上执行函数的工作示例。对于复杂的命令,您将需要使用-EncodedCommand parameter of powershell.exe
将证书复制到远程系统以避免2跳问题

Copy-Item "C:\temp\SomeRootCa.cer" "\\Computer1\C$\temp\"

对要使用的命令进行编码

$encoded = [Convert]::ToBase64String(
               [System.Text.Encoding]::Unicode.GetBytes(
                   {Import-Certificate -FilePath C:\temp\somerootca.cer -CertStoreLocation cert:\localmachine\disallowed}
               )
           )

在远程计算机上生成进程

Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList "powershell.exe -encodedcommand $encoded" -ComputerName Computer1

您将在计算机上获得类似于以下内容的输出

__GENUS          : 2
__CLASS          : __PARAMETERS
__SUPERCLASS     :
__DYNASTY        : __PARAMETERS
__RELPATH        :
__PROPERTY_COUNT : 2
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
ProcessId        : 8748
ReturnValue      : 0
PSComputerName   :

请注意,返回值0表示成功,这仅表示派生了powershell,而不是您执行的命令成功。如果您想要一些日志记录,则需要将其保存到您编码的命令中
编辑:Foreach-ObjectGet-Content

Get-Content C:\some\file\name\here.txt | Foreach-Object -begin {
    $encoded = [Convert]::ToBase64String(
               [System.Text.Encoding]::Unicode.GetBytes(
                   {Import-Certificate -FilePath C:\temp\somerootca.cer -CertStoreLocation cert:\localmachine\disallowed}
               )
           )
} -process {
    if(Test-Connection $_ -quiet){
        Copy-Item "C:\temp\SomeRootCa.cer" "\\$_\C$\temp\"
        Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList "powershell.exe -encodedcommand $encoded" -ComputerName $_
    }
}

请不要将此复制/粘贴到生产环境中。阅读它并了解正在发生的事情。使用函数的ISE to debug部分,并将其一点一点地拼凑起来。

相关问题