2016-06-15 3 views
1

これは、リモートシステムのIPをホワイトリストするスクリプトです。私のスクリプトはローカルシステム上のテキストファイルからデータを読み込み、次にリモートサーバ上でscriptblockを実行したい行をforeachしたい。各行をテキストファイルからリモートコンピュータに送信しますか?

テキストファイルには、次のようになります。ここでは

url1 
url2 
url3

が私のコードです:

Invoke-Command -ComputerName $($server.text) -Credential ciqdev\riteshthakur { 
    param($a, $b, $c, $url) 

    Set-Location "C:\Windows\System32\inetsrv" 
$url | foreach { 
    .\appcmd.exe set config "$_" -section:system.webServer/security/ipSecurity /+"[ipAddress='$($a)',allowed='$($c)',subnetMask='$($b)']" /commit:apphost 
} 
} -ArgumentList $ip.text, $mask.text, $allowed, (get-content "File location") 

これは、IISのすべてのウェブサイトのすべてのページに提供されるIPを追加します。助けてください。

+0

? –

+0

私はリモートに配列を渡すと、すべてのウェブサイトのすべてのページとフォルダのエントリを許可するIPを追加します。一方、URLを1つだけ渡すと、渡されたURLだけが追加されます。 –

答えて

2

EDIT:コマンドを動的に生成し、一度呼び出すことで効率が向上しました。

テキストファイルを行の配列として読み込み、各行を繰り返して、リモートシステムで実行するコマンドを生成する、次のような手法を使用することをお勧めします。

コマンドを文字列として生成したら、コマンド文字列に基づいて[ScriptBlock]::Create()メソッドを呼び出してScriptBlockオブジェクトを作成し、それをInvoke-Commandに渡すだけです。

PowerShell Splattingの概念に慣れ親しむことをお勧めします.YouTubeのビデオ:https://www.youtube.com/watch?v=CkbSFXjTLOAでお話します。これは本当に強力なコンセプトであり、コードを読みやすくするのに役立ちます。以下のサンプルコードでは、PowerShell Splatting(PowerShell 3.0以降で使用可能)を使用しています。

### Read the text file on the local system 
$Whitelist = Get-Content -Path IPwhitelist.txt; 

### Generate the stub for the remote command 
$RemoteCommand = @' 
param($a, $b, $c) 

Set-Location -Path C:\Windows\System32\inetsrv 
'@ 

### Add more commands to the remote command 
foreach ($Line in $Whitelist) { 
    $RemoteCommand += '{1}.\appcmd.exe set config "{0}" -section:system.webServer/security/ipSecurity /+"[ipAddress=''$($a)'',allowed=''$($c)'',subnetMask=''$($b)'']" /commit:apphost' -f $Line, "`n"; 
} 

### Invoke the entire remote command (once) 
$Command = @{ 
    ComputerName = $Server.Text 
    Credential = Get-Credential -Credential ciqdev\riteshthakur 
    ScriptBlock = [ScriptBlock]::Create($RemoteCommand); 
    ArgumentList = @($ip.text, $mask.text, $allowed) 
    } 
Invoke-Command @Command; 
+0

これは、リモートでコマンドを実行することを意味し、新しい再帰のたびに新しいデータのためにローカルに戻るでしょう。それは長い方法ではありません。リモートでデータの配列を送信して再帰を行う方法はありますか? *助けてくれてありがとう* –

+0

@RiteshThakur私は、コマンドを動的に生成するようにスクリプトを変更し、それを一度だけ起動します。これにより、リモートWinRM接続の数を減らすことで効率が向上します。 –

2

だけGet-Contentコマンドレットを使用してファイルを読み込み、Foreach-Objectコマンドレットを使用して、各項目を反復処理:期待通りに何をして動作しません

Invoke-Command -ComputerName $($server.text) -Credential ciqdev\riteshthakur { 
    param($a, $b, $c, $urls) 

    Set-Location "C:\Windows\System32\inetsrv" 
    $urls | Foreach { 
    .\appcmd.exe set config $_ -section:system.webServer/security/ipSecurity /+"[ipAddress='$($a)',allowed='$($c)',subnetMask='$($b)']" /commit:apphost 
    } 
} -ArgumentList $ip.text, $mask.text, $allowed, (Get-Content 'Path_to_your_file') 
+0

"各ファイルのデータ"の代わりに何を書きますか? –

+0

martinあなたは説明できますか?これは、データの配列を一度リモートに送信してから、残りのデータがそこで実行されるか、毎回ローカルとリモートの間でデータのやり取りが行われることを意味しますか? –

+0

申し訳ありませんが、私はあなたの質問を誤解した、私はあなたが各URLのブロックを食い止めたいと思った...私の編集された答えを試してみてください。 –

関連する問題