*[[Windows]]/PowerShell [#p9ab2a10] #contents **PowerShell基本操作 [#n4459c36] ***リモート先のPowerShellを操作する [#u4517d23] -リモート先のサーバー Enable-PSRemoting -Force -クライアント側の操作 winrm quickconfig -force(PowerShell 2だとエラーになるので、forceの代わりに q を指定) Set-Item WSMan:\localhost\Client\TrustedHosts * -Force Enter-PSSession 接続先 -Credential 接続アカウント ※ Administratorsグループか、Remote Management Usersグループのユーザーのみ接続可能 ***ポートに接続できるか確認 [#q07a8303] $c = New-Object System.Net.Sockets.tcpClient $c.connect("IPアドレス", ポート番号) 接続できない場合は、接続エラーが返ってくる。 $c.connected 接続されてる場合は、True、接続されてない場合は Falseとなる。 $c.close() オブジェクトをCLOSEし破棄する。 Windows Server 2012以降であれば以下のコマンドでも確認可能。~ Test-NetConnection [ターゲット] -Port [ポート番号] ***モジュール [#ve1fe7f2] -使用可能なモジュール一覧表示 Get-Command -Module モジュール名 -モジュールのインポート(Windows Server2012からはコマンド実行時に必要だったら自動的にImportするっぽい) Import-Module モジュール名 ***フォーマット [#pd1d5c53] -出力結果のフォーマットを指定する(format) コマンド | { Format-List | Format-Table | Format-csv | Format-Custom } Format-Table -Autosize(ft -a)で、カラム幅が自動的に広がって項目が切り捨てられない状態で表示できる。 ***ファイル操作 [#k5bebb4c] -出力結果をCSV形式で保存する(epcsv) コマンド | export-csv -encoding default -path C:\User.csv -notype |BGCOLOR(#f0f8ff):''オプション''|BGCOLOR(#f0f8ff):''説明''| |-encoding|出力する文字コードを指定| |-notype|ヘッダー行を含めない| |-force|読み取り専用ファイルであっても書き込む| ~ -特定の列だけ抽出する(select) コマンド | Select-Object 列 [,列] ... ※ エイリアスは、select |BGCOLOR(#f0f8ff):''オプション''|BGCOLOR(#f0f8ff):''説明''| |-first 数|先頭から指定した行数のみ表示| |-last 数|末尾から指定した行数のみ表示| |-skip 数|指定した行数スキップする(1を指定したら2行目から表示)| ~ -特定の行だけ抽出する(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のエイリアス -テキストファイルの入出力 |BGCOLOR(#f0f8ff):''コマンド''|BGCOLOR(#f0f8ff):''説明''| |Get-Content|引数で指定したファイルを読み込む。UTF16、SJIS、UTF8(BOMあり)の読み込みを行える。それ以外は、-Encodeオプションを利用して読み込む| |Get-Content|引数で指定ファイルへ書き出す。SJISで書き込まれる。| |Out-File|引数で指定ファイルへ書き出す。SJISで書き込まれる。UTF16で書き込まれる。リダイレクトもUTF16で書きこまれる| ***WMI [#be940923] -WMIの一覧を出力 Get-WmiObject(gwmi)-list Get-WmiObject | ? { $_.Name -like "Win32*Process*" } -WMIの実行 Get-WinObject {WMI} [| ft -a] |BGCOLOR(#f0f8ff):''WMI''|BGCOLOR(#f0f8ff):''説明''| |Win32_Product|インストールソフトウェアを取得| |Get-WmiObject Win32_OperatingSystem|システム情報(ロケールとか)| |Get-WmiObject Win32_Processor|CPU情報| |Win32_PhysicalMemory|物理メモリの情報| ***Get-ChildItem [#r5cbb8c7] -ファイル名一覧を取得する~ Get-ChildItem [フォルダ名] [オプション] |BGCOLOR(#f0f8ff):''オプション''|BGCOLOR(#f0f8ff):''説明''| |-Recurse|サブディレクトリも含め再帰的に検索| |-Filter|検索結果に含めるファイル名を指定| |-Exclude|検索結果から除外するファイル名を指定| ~ -カレントディレクトリのファイルを一覧取得し、容量順に並び替えて表示~ FullNameだと長すぎて途切れる。その場合は、export-csv -encoding default -path C:\User.csv のようにCSV出力すれば良い~ Get-ChildItem -Recurs | Select-Object LastWriteTime,Length,FullName | Sort-Object Length **PowerShell モジュール [#u27f2fbf] ***Active Directory [#n877de31] -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 * |BGCOLOR(#f0f8ff):''オプション''|BGCOLOR(#f0f8ff):''説明''| |-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" ~ ***グループポリシー [#ka26aba0] -GPOの確認 Get-GPO -All -既定のGPOを元に戻す Dcgpofix.exe /Target:{ Domain | DC | BOTH } -セキュリティフィルター設定(Domain Usersグループに対して読み取り許可) Set-GPPermissions -Name "GPO-Name" -TargetName "Domain Users" -TargetType { Computer | User | Group } -PermissionLevel オプション |BGCOLOR(#f0f8ff):''オプション''|BGCOLOR(#f0f8ff):''説明''| |GpoApply|セキュリティフィルターの登録| |None|セキュリティフィルターの削除| |GpoRead|読み取りの委任| |GpoEdit|編集の委任| |GpoEditDeleteModifySecurity|編集、削除、セキュリティの変更を委任| -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 優先順位 -継承のブロック Set-GPInheritance -Target "OU=Sales,DC=contoso,DC=com" -IsBlocked Yes -GPO適用状況を出力 Get-GPOReport -Name "GPO-Name" -ReportType HTML -Path ファイル名 -GPOバックアップ Backup-GPO -name "GPO-Name" -Path バックアップ先フォルダ名 -GPO復元 Restore-GPO -name "GPO-Name" -Path バックアップ先フォルダ名 -GPOインポート New-GPO -name "GPO-Name" [-StarterGpoName スタートアップGPO名] Import-GPO -BackupGpoName バックアップしたGPO名 -TargetName インポート先のGPO名 -Path フォルダ名 ~ #br **PowerShellプログラム [#ed15593b] *** 基本の変数設定 [#pfe5c2de] $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 ~ ***ヘッダー行を出力させない(タブ区切りで出力) [#j3ed1451] dir | ForEach-Object {$_.抽出対象列 + "`t" +$_.抽出対象列 ...} ※ ForEatch-Object は foreach や % で代替可能 ~ ***繰り返し [#rc0bf503] $dir="New\" foreach ($file in Get-ChildItem | where {$_.Name -like "*.csv"} | % {$_.Name} ) { $Get-Content $file | Select-String "AAAAA" | Set-Content $dir$file Get-Content $file | Select-String "AAAAA" | Set-Content $dir$file }