2017-11-14 3 views
1

セキュリティのためにWinRMが環境内で無効になっている場合、Powershellを使用した証明書をリモートシステムのCertstoreにインポートする方法を教えてください。私はいくつかの問題を回避しようとしましたが、すべて失敗しました。してください私は初心者です。WinRMがpowershellで無効になっている場合、リモートシステムのCertstoreに証明書をインポートする方法

私はこれを回避しようとしましたが、はい、その信頼できないストアを知っています。それははるかに堅牢で簡単なプロセスを使用することであるとして、コンピュータに証明書を展開する

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

「セキュリティのため」何ですか? – TheIncorrigible1

+0

@ TheIncorrigible1これは古くからの "WinRMは安全ではありません"という誤りです。 –

+0

コードに表示されている内容は、リモートシステム上の証明書をインポートするものではありません。 '$ server'を' ForEach'ループにパイプしますが、決して '$ _'を参照しないでください。乱数や、Catの品種をあなたの 'ForEach'ループにパイプすることもできます。 – TheMadTechnician

答えて

0

は、おそらく最高のGroup Policyを介して達成されます。

グループポリシーを使用できない場合は、対象のシステムのOSによっては、他のいくつかのソリューションのいずれかを使用できる可能性があります。あなたは次の操作を行うことができ、彼のソリューションを使用してWinRMなしまたはWindows 10より古いリモートコンピュータ上の輸入を許可するようにカバーの下に.NETを使用しています

Boe Prox wrote an Import-Certificate機能と説明:

$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(WinRMが必要)でラップするか、Invoke-WMIMethodにフォールバックする必要があります。アウトプットを使用したり作業したりするのはあまり親切ではありませんが、うまくいくでしょう。これは、WinRMなしでリモートコンピュータ上で関数を実行する実例です。複雑なコマンドの場合は、 - EncodedCommand parameter of powershell.exeを使用します。私たちは、リモートコンピュータ上のプロセス

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

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

スポーンを使用するコマンドをエンコードし

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

2つのホップの問題を回避するには、リモートシステムに

コピー証明書お使いのコンピュータで次のような出力が得られます

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

成功を示す0の戻り値が唯一あなたが実行されたコマンドが成功したことはない、PowerShellのが生み出されたことを示していることに注意してください。本番環境へForeach-Object

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 $_ 
    } 
} 

Get-Contentはコピーしないでください/パスタこの:あなたがコマンドにそれを焼く必要がありますいくつかのログをしたい場合は、

EDITをコードします。それを読んで何が起こっているのか理解する。関数の一部をISE to debugで使用し、ビット単位でまとめてください。

また、最小限の研究(Get-ContentやForeach-Objectなど)を行わずにSSCCEと表示されている場合、質問はトピックとしてフラグが立てられ、閉じられる可能性があります。

+0

私はpowershellとプログラミングには一般的ではないことをフィードバックして理解しています。あなたが提供したスクリプトはまだ動作していません。私は何のエラーも受けていません。戻り値は0で、スクリプトが実行されたことを示しています。しかし、まだ店に証明書がありません。コピー機能が正常に動作し、証明書が指定されたサーバー上にあります。 – JWill

+0

また、忘れてしまった。このスクリプトは、サーバー名をスクリプトにハードコードします。私はサーバーのhundardsを更新するのを見ている。これは、私が正しいことをしていないにもかかわらず、私がget-contentを試みてfor-eachを実行しようとした理由です。 – JWill

+0

'get-content C:\ somefilewithservernames.txt'を使ってサーバ名を取得し、' foreach-object'コマンドに送るだけで、あなたが使いたいコマンドのセットをラップします。 – StephenP

関連する問題