PowerShell基本操作 †
リモート先のPowerShellを操作する †
- リモート先のサーバー
Enable-PSRemoting -Force
ポートに接続できるか確認 †
$c = New-Object System.Net.Sockets.tcpClient
$c.connect("IPアドレス", ポート番号)
接続できない場合は、接続エラーが返ってくる。
$c.connected
接続されてる場合は、True、接続されてない場合は Falseとなる。
$c.close()
オブジェクトをCLOSEし破棄する。
Windows Server 2012以降であれば以下のコマンドでも確認可能。
Test-NetConnection [ターゲット] -Port [ポート番号]
モジュール †
- モジュールのインポート(Windows Server2012からはコマンド実行時に必要だったら自動的にImportするっぽい)
Import-Module モジュール名
フォーマット †
ファイル操作 †
- 特定の行だけ抽出する(where)
コマンド | Where-Object { $_.抽出対象列 -like "*キーワード*" }
※ エイリアスは where
(例) OU=商店 の文字列を含む列だけ出力する
Get-ADUser -Filter * -Properties DistinguishedName | select SamAccountName,Surname,DistinguishedName | where { $_.DistinguishedName -like "*OU=商店*" }
- カンマ区切りのCSVファイルから特定の列だけ抽出する(下記例では1,2,5列目のレコードのみ出力
If (Test-Path before.csv) { # ファイルがあった場合のみ処理する
foreach ($str in Get-Content before.csv | select -skip 1 | % { $_ -replace """",""} | % { $_ -replace "OU=",""}) {
$str = $str -split ","
$str[0]+","+$str[1]+","+$str[3] | Out-File after.csv -append
}
}
※ foreach は ForEach-Objectのエイリアス
- テキストファイルの入出力
コマンド | 説明 |
Get-Content | 引数で指定したファイルを読み込む。UTF16、SJIS、UTF8(BOMあり)の読み込みを行える。それ以外は、-Encodeオプションを利用して読み込む |
Get-Content | 引数で指定ファイルへ書き出す。SJISで書き込まれる。 |
Out-File | 引数で指定ファイルへ書き出す。SJISで書き込まれる。UTF16で書き込まれる。リダイレクトもUTF16で書きこまれる |
WMI †
Get-ChildItem †
PowerShell モジュール †
Active Directory †
- ADに属するユーザー、グループ、コンピューターを確認
-- AD関連モジュール読み込み(Windows Server 2008R2以降はAD関連コマンド実行する際に自動的にImportするので実行不要)
Import-Module ActiveDirectory
-- コマンド例
Get-ADUser -Filter {samAccountName -like "admin*"} -Properties *
Get-ADGroup -Filter * -Properties *
Get-ADComputer -Filter * -Properties *
Get-ADObject -Filter {objectGUID -Eq "123455-XXXXXX-XXXXXX-XXXXXX-XXXXX"} -Properties *
オプション | 説明 |
-Filter | 表示対象を指定。指定は必須。*で全て表示。属性でフィルタ指定することも可能 |
-Properties | 表示したいプロパティをカンマ区切りで列挙する。*で全て表示 |
Move-ADObject -Identity "移動元オブジェクト" -TargetPath "移動先のOU"
(例) Move-ADObject -Identity "CN=ServerA, CN=Computer,DC=Test,DC=com" -TargetPath "CN=Server,DC=Test,DC=com"
グループポリシー †
- GPOリンク
New-GPLink -Name "GPO-Name" -Target "OU=Sales,DC=contoso,DC=com"
Set-GPLink -Name "GPO-Name" -Target "OU=Sales,DC=contoso,DC=com" -LinkEnabled { Yes | No } -order 優先順位
PowerShellプログラム †
基本の変数設定 †
$ScriptName = $MyInvocation.MyCommand.Name
$LogName = ($ScriptName -replace '(.+)(\.[^.]+$)','$1') + "_" + (Get-Date -Format "yyyyMMddHHmmss") + ".log"
$ConfName = ($ScriptName -replace '(.+)(\.[^.]+$)','$1') + "." + "conf"
$CurrentDir = Split-Path $MyInvocation.MyCommand.Path -Parent
$LogFile = $CurrentDir + "\..\log\" + $LogName
$ConfFile = $CurrentDir + "\..\conf\" + $ConfName
(例) D:\tool\bin\TEST.ps1 を実行した結果、変数の値は上から以下の通りになる
TEST.ps1
TEST_20190524104156.log
TEST.conf
D:\tool\bin
D:\tool\bin\..\log\TEST_20190524104156.log
D:\tool\bin\..\conf\TEST.conf
ヘッダー行を出力させない(タブ区切りで出力) †
dir | ForEach-Object {$_.抽出対象列 + "`t" +$_.抽出対象列 ...}
※ ForEatch-Object は foreach や % で代替可能
繰り返し †
$dir="New\"
foreach ($file in Get-ChildItem | where {$_.Name -like "*.csv"} | % {$_.Name} ) {
Get-Content $file | Select-String "AAAAA" | Set-Content $dir$file
}