Windows/PowerShell

PowerShell基本操作

リモート先のPowerShellを操作する

  • リモート先のサーバー
    Enable-PSRemoting -Force
  • クライアント側の操作
    winrm quickconfig -force(PowerShell 2だとエラーになるので、forceの代わりに q を指定)
    Set-Item WSMan:\localhost\Client\TrustedHosts * -Force
    Enter-PSSession 接続先 -Credential 接続アカウント
    ※ Administratorsグループか、Remote Management Usersグループのユーザーのみ接続可能

ポートに接続できるか確認

$c = New-Object System.Net.Sockets.tcpClient
$c.connect("IPアドレス", ポート番号)
接続できない場合は、接続エラーが返ってくる。
$c.connected
接続されてる場合は、True、接続されてない場合は Falseとなる。
$c.close()
オブジェクトをCLOSEし破棄する。

Windows Server 2012以降であれば以下のコマンドでも確認可能。

Test-NetConnection [ターゲット] -Port [ポート番号]

モジュール

  • 使用可能なモジュール一覧表示
    Get-Command -Module モジュール名
  • モジュールのインポート(Windows Server2012からはコマンド実行時に必要だったら自動的にImportするっぽい)
    Import-Module モジュール名

フォーマット

  • 出力結果のフォーマットを指定する(format)
    コマンド | { Format-List | Format-Table | Format-csv | Format-Custom }
    Format-Table -Autosize(ft -a)で、カラム幅が自動的に広がって項目が切り捨てられない状態で表示できる。

ファイル操作

  • 出力結果をCSV形式で保存する(epcsv)
    コマンド | export-csv -encoding default -path C:\User.csv -notype
    オプション説明
    -encoding出力する文字コードを指定
    -notypeヘッダー行を含めない
    -force読み取り専用ファイルであっても書き込む

  • 特定の列だけ抽出する(select)
    コマンド | Select-Object 列 [,列] ...
    ※ エイリアスは、select
    オプション説明
    -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のエイリアス

WMI

  • WMIの一覧を出力
    Get-WmiObject(gwmi)-list
    Get-WmiObject | ? { $_.Name -like "Win32*Process*" }
  • WMIの実行
    Get-WinObject {WMI} [| ft -a]
    WMI説明
    Win32_Productインストールソフトウェアを取得
    Get-WmiObject Win32_OperatingSystemシステム情報(ロケールとか)
    Get-WmiObject Win32_ProcessorCPU情報
    Win32_PhysicalMemory物理メモリの情報

Get-ChildItem

  • ファイル名一覧を取得する
    Get-ChildItem [フォルダ名] [オプション]
    オプション説明
    -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 モジュール

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の確認
    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 オプション
    オプション説明
    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 フォルダ名

     

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 や % で代替可能


トップ   編集 凍結解除 差分 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-06-08 (土) 18:37:53 (511d)