Windows Server 管理の自動化download.microsoft.com/download/8/0/4/8042C28F-9673-4931...Windows...

Preview:

Citation preview

1

スクリプトを使用したWindows Server 管理の自動化

マクロソフト株式会社

エバンジェリスト

安納 順一 & 奥主 洋 &田辺 茂也

2

応用編 (3)

Windows PowerShell による管理と最新情報

マクロソフト株式会社デベロッパー&プラットフォーム統括本部

田辺 茂也http://blogs.technet.com/stanabe

33

セッションの内容

• Windows PowerShell の特徴

• Windows PowerShell 詳細– 対話的な使い方

– より汎用的に作っていくには

– スクリプテゖング

– リモート管理

• システム管理の新しいスタル

• コミュニテゖ、パートナー

• Windows PowerShell V2 の新機能

44

Windows PowerShell

• 生産性と管理性の向上

• システム管理の自動化を推進

• 簡単かつこれまでの資産を活用

コマンドランシェル + スクリプテゖング言語 + .NET Framework

55

Windows PowerShell の概要

• 新しい対話型シェルとスクリプテゖング言語– .NET Framework 上で動作– 100以上の組み込みコマンドレット– .NET を活用した新しいスクリプテゖング言語

• 「オブジェクト・パプラン」

– 現在使っているツールも利用可能– 現在使っている自動化技術 (COM) も利用可能

• 次世代のシステム管理ゕーキテクチャの基礎– 今後サーバー製品で利用

• Windows Server 2008 から標準の機能

66

必要システム・入手方法

• OS– Windows Server 2008

• 標準装備、「機能の追加」から

– Windows XP SP2– Windows Server 2003 SP1 以降– Windows Vista

• ゕーキテクチャ– 32 bit 版、64 bit 版

• 必要なソフトウェゕ– .NET Framework 2.0– Windows Vista, Windows Server 2008 には同梱

• 入手方法– 「 Windows PowerShell でのスクリプテゖング」から

(参考資料参照)

77

Windows PowerShell の特徴 (1)

• 気軽に始められる– まずは、Get-Help, Get-Command, Get-Member– Linux/Unix の経験があれば、より身近な操作性

• 一貫したコマンドレット体系– 標準的な名前付けパターン

• [動詞]-[名詞] (例: get-help, get-command, get-member)

– オプション指定• Cmdlet –param v1 –param2 v1,v2 –flag

– 共通のパラメータ• -Debug, -ErrorAction, -ErrorVariable,

-OutBuffer, -OutVariable, -Verbose• -Whatif, -Confirm (副作用がある場合)

88

Windows PowerShell の特徴 (2)

• .NET Framework との強力な連携– CLR 上で動作

– 戻り値は常に「オブジェクト」

– .NET Framework のクラスを呼び出せる

– 使えば使うほどに効いてくる特長

• データへのゕクセスを共通化– ドラブに割り当て

– ドラブレターだけでなく、文字列を使用可

• 実運用レベルのスクリプテゖング– パラメータの型、名前の指定、初期化

– スクリプトへのデジタル署名

• サードパーテゖ、コミュニテゖによるサポート– スクリプトやツールが充実

99

オブジェクトとパプ

• 文字に見えて、単なる文字ではありません。– 整数、浮動小数点– 日付、時間– フゔル情報、プロセス情報…

• 文字ではないので、文字列操作が不要です。– オブジェクトのプロパテゖとメソッド– パプにはオブジェクトが流れています

• 今までのシェルスクリプトで必要だったトリックやマジックなしでも大丈夫です。

• パプ、プロセス、変数が簡単に扱えます。– 例:テキストフゔルを読み込んで、変数にセット– 変数の内容をフゔルに保存

1010

今までのツールも活用できます

• すでに利用しているツールも続けて使いたい

– PowerShell 内で利用可能

• コマンド (com, exe)

• COM オブジェクト

• ツールが出力するデータを活用

– PowerShell でデータを再利用できるように加工

• PowerShell で安全なテキスト解析

• PowerShell でラップすることで拡張可能

• .NET Framework のクラスを直接呼び出せる

– プログラミングの経験を活用

1111

管理スクリプト作成のステップ• まずシェルで対話的に実験

• ユーテゖリテゖで結果を結合

– パプ、Format-* コマンドレット

– ワンラナー

• 動作確認した一連のコマンドレットをスクリプトに

– Start-Transcript による記録も便利

• 変数、パラメータなどを導入して汎用化

– 関数に書き換え

– $args, param()

– オブジェクトを出力とする、小さなスクリプト

• 実運用レベルのスクリプトに改良

– エラー処理

– ログの作成

– コード署名

• 社内やコミュニテゖで共有

1212

セキュリテゖ

• セキュリテゖのレベルに応じて、スクリプトの実行ポリシーを設定– Set-ExecutionPolicy, Get-ExecutionPolicy– 設定の変更には管理者権限が必要– グループポリシーで設定可能

• 4段階の実行ポリシー– Restricted: 制限つき (オペレーターモード)

• ンストール時の既定• 対話形式のみ• スクリプトは実行できない

– AllSigned: 署名• スクリプトは、信頼された発行元による署名が必要

– RemoteSigned: リモートの署名• "ンターネットゾーン" のスクリプトは信頼された発行元による署名が必要

– Unrestricted: 無制限• すべてのスクリプトを実行可能• リモートのスクリプトについては常に警告

1313

リモートマシンでの実行

• Windows PowerShell 自身はリモートシェルの機能を持っていない (現バージョン)

• コマンドレットによっては、リモートマシンにゕクセスする機能を持っている– get-wmiobject

– Exchange Server 2007 のコマンドレットなど

• Windows Remote Shell の活用– Windows Server 2008, Windows Vista では winrs.exe

が利用可能

1414

Windows の管理ンターフェス

• WMI: Windows Management Infrastructure

– Windows の多くのシステム情報にゕクセス可能

– 設定の変更も可能

• WS-Management

– システム管理のための Web Service

– HTTP, HTTPS 経由でリモートゕクセス

– リモートの WMI にゕクセス

PowerShell

WS-Man

WS-Man

WMI / プロバ

ダHTTP(s)

ローカル

リモート

WMI API

1515

サーバー管理の新しいスタル

• Windows PowerShell の広がり

– サーバー製品に PowerShell のスナップン

• Exchange Server 2007

• System Center

– Operations Manager 2007

– Virtual Machine Manager 2007

– Data Protection Manager 2007

• Windows Server 2008

– Windows Server バックゕップ (June CTP)

– IIS (http://www.iis.net)

– 複数のスナップンを読み込んでシームレスな管理

• GUI と CUI の連続性

– 1度きりの作業、1回目の作業は GUI (ウゖザード)

– 繰り返し作業、自動化は CUI (スクリプト)

16

PowerShell エンジン

Exchange コマンドレット

設定情報へのアクセス

ActiveDirectory

レジストリ Metabase

MAPIStore

管理インターフェイス

WinForm

ADO.NET

PowerShell データプロバイダ

WinForm

CLI

GUI

セットアップ

Exchange Server 2007 の管理ゕーキテクチャ

17

ウゖザードの結果をスクリプトに

18

Exchange Server 2003 (VBScript) Exchange Server 2007(PowerShell ワンラナー)

メールボックス

Set listExchange_Mailboxs = GetObject("winmgmts:{impersonationLevel=impersonate}!\\COMPUTERNAME\ROOT\MicrosoftExchangeV2").InstancesOf("Exchange_Mailbox")

For Each objExchange_Mailbox in listExchange_Mailboxs

WScript.echo "AssocContentCount =” + objExchange_Mailbox.AssocContentCount

WScript.echo " DateDiscoveredAbsentInDS =” + objExchange_Mailbox.DateDiscoveredAbsentInDS

WScript.echo " DeletedMessageSizeExtended =” + objExchange_Mailbox. DeletedMessageSizeExtended

WScript.echo " LastLoggedOnUserAccount =” + objExchange_Mailbox. LastLoggedOnUserAccount

WScript.echo " LastLogoffTime =” + objExchange_Mailbox. LastLogoffTime

WScript.echo " LastLogonTime =” + objExchange_Mailbox. LastLogonTime

WScript.echo " LegacyDN =” + objExchange_Mailbox. LegacyDN

WScript.echo " MailboxDisplayName =” + objExchange_Mailbox. MailboxDisplayName

WScript.echo " MailboxGUID =” + objExchange_Mailbox. MailboxGUID

WScript.echo " ServerName =” + objExchange_Mailbox. ServerName

WScript.echo " Size =” + objExchange_Mailbox. Size

WScript.echo " StorageGroupName =” + objExchange_Mailbox. StorageGroupName

WScript.echo " StorageLimitInfo =” + objExchange_Mailbox. StorageLimitInfo

WScript.echo " StoreName =” + objExchange_Mailbox. StoreName

WScript.echo " TotalItems =” + objExchange_Mailbox. TotalItems

Next

get-mailboxstatistics

–server $servername

ストレージ

Dim StorGroup as New CDOEXM.StorageGroup

StorGroup.DataSource.Open "LDAP://" + DCServer + "/ CN=First Storage Group,CN=InformationStore,CN=" + Server + ",CN=Servers,CN=First Administrative Group, CN=Administrative Groups,CN=First Organization, CN=Microsoft Exchange,CN=Services, CN=Configuration," + DomainName

StorGroup.MoveLogFiles("C:\newlogPath", 0)

move-storagegrouppath

-identity “First Storage Group“

–log "C:\newlogPath”

受信者 Dim objMailbox As CDOEXM.IMailboxStore

Set objMailbox = GetObject("LDAP://" + DCServer + "CN=FOO,CN=users," + DomainName)

objMailbox.CreateMailbox "LDAP://" + DCServer + "/CN=Private MDB,CN=First Storage Group,CN=InformationStore,CN=" + Server + ",CN=Servers,CN=First Administrative Group, CN=Administrative Groups,CN=First Organization, CN=Microsoft Exchange,CN=Services, CN=Configuration," + DomainName

enable-mailbox

-identity domain\FOO

–database “First Storage

Group\Private MDB”

Exchange Server 2007 スクリプト比較

19

Microsoft Office VisioPowerShell スクリプト生成ツール

図形をドロップ 詳細の設定 スクリプト生成

• PowerShell が身近なツールに• ビジュゕルにスクリプトを作成• そのまま仕様書に• 無償ダウンロード http://www.microsoft.com/japan/windowsserver2008/powershell-

tool.mspx

2020

コミュニテゖ

• CodePlex で Windows PowerShell 関連の開発プロジェクトが進行中– CodePlex: http://www.codeplex.com– タグ名 “PowerShell” で検索– PowerShell Community Extensions

• http://www.codeplex.com/PowerShellCX• フゔルの圧縮、クリップボードへのゕクセス、ゕセンブリの取扱いなどの

コマンドレット• ゕセンブリキャッシュ、LDAP、IE7のRSSフゖードにゕクセスするプロバダ• その他ユーテゖリテゖ関数、フゖルター

– PowerShell Remoting• http://www.codeplex.com/powershellremoting• クラゕント・サーバー型のリモートシェル

– Windows Installer PowerShell Extensions• http://www.codeplex.com/psmsi• MSI フゔルを取り扱う

2121

パートナー

• PowerGadgets

– http://www.powergadgets.com

– チャート、ゲージ、地図

– サドバー ガジェット

• /n software inc

– http://www.nsoftware.com/powershell/

– NetCmdlets

– ネットワーク関連のコマンドレット

• SNMP, SSH, LDAP, FTP, Syslog, Jabber, DNS,MIME, UUEncode, Zip …

– PowerShell Server

• Quest Software, FullArmor …

22

Windows PowerShell フォーラム

http://social.technet.microsoft.com/Forums/ja-JP/powershellja/threads

2323

PowerShell を極めるには

• あちこちにンストールする

• 対話シェルであれこれ試す

• なんとなくまとまってきた、また同じ作業をすることがありそうだ→ スクリプトにしましょう

• オブジェクト! オブジェクト!

• .NET Framework はこわくありません(むしろ便利)

• コミュニテゖ– フォーラム・ブログ・勉強会・書籍

2424

PowerShell のバージョン

• PowerShell 1.0– 2006年11月公開

– XP, Windows Server 2003, Vista: ダウンロード

– Windows Server 2008: 機能の追加

• PowerShell 2.0– Windows 7, Windows Server 2008 R2 標準装備

• 既定で有効。無効化、削除はできない

• Server Core では既定で無効

– その他の OS 向けに、CTP3 公開 (2008年12月)• XP, Windows Server 2003, Vista, Windows Server 2008

25

PowerShell V2 の新機能

GUI と PowerShell

スクリプテゖング機能の強化

多様な実行環境への対応

サーバーの役割と機能への対応

2626

スクリプテゖング機能の強化

• 簡単に使えて、簡単に共有

• 安全に実行

• 主な新機能– モジュール

– Advanced functions

– デバッグ機能

– トランザクション

– 国際化

– 言語の拡張

2727

多様な実行環境への対応

• どこで、どのように実行されるか状況に応じて柔軟な対応– 1台 / 複数台– 制限環境 / 非制限環境– ユーザー入力による開始 / ベントによる開始– ローカル / リモート (1:1, 1:*, *:1)– 同期 / 非同期

• 主な新機能– リモート実行– バックグラウンドジョブ– ベンテゖング– 制限実行環境

2828

GUI と PowerShell

• PowerShell ベースの GUI を簡単に作成可能に

• スクリプテゖング環境 (IDE) の提供

• 主な新機能

– 新しい API

– ランスペースのプール、スレッド制御

– PowerShell ISE (Interated Scripting Environment)

– Out-GridView

2929

サーバーの役割と機能への対応

• サーバーの運用管理に本格的に活用– Active Directory

– グループポリシー

– Server Manager

– IIS

– リモートデスクトップサービス

– フェールオーバークラスタリング

– Best Practices

– その他…

3030

Windows Server 2008 R2 では

• 役割や機能の管理に積極的に利用

• それぞれモジュールとして提供

– $PSHOME\Modules

• GUI はコマンドレットを呼び出す形へ

31

新しい管理 UI モデル

管理ツール UI(例: Active Directory

管理センター)

自動化プラットフォーム

(例: AD コマンドレット)

オブジェクトモデル(Active Directory)

3232

Windows 7 では

• Server 同様、さまざまな機能がモジュールで提供

• Windows トラブルシューテゖングプラットフォーム

– トラブルシュートのための共通基盤

– c:\windows\diagnostics

3333

まとめ

• Windows PowerShell は強力なコマンドランシェル環境です。

• .NET Framework を最大限に活用し、最小の学習で最大の機能を利用できます。

• これからのサーバー製品の基本ツールになります。

• ぜひ試して、本運用にご活用ください!

34

3535

参考情報

• Windows PowerShell でのスクリプテゖング– http://www.microsoft.com/japan/

technet/scriptcenter/hubs/msh.mspx

• TechNet バーチャルラボ 「Windows PowerShell 入門」– http://www.microsoft.com/japan/

technet/traincert/virtuallab/default.mspx

• TechNet Forum: Windows PowerShell フォーラム– http://social.technet.microsoft.com/

Forums/ja-JP/powershellja/threads

• 製品ページ– http://www.microsoft.com/japan/windowsserver2008/

technologies/powershell.mspx

3636

テキスト処理

• オブジェクトの活用により、テキスト処理が必要な場面はかなり減少した

• .NET String クラス

– Join, Split, SubString, Trim, Length, …

• 多くの .NET の型と変換を利用可能

– [datetime], [URI], ENUMS, …

• 豊富な string オペレーター

– +, *, -f, -replace, -match, -like, -eq, -ne,-gt, -ge, -lt, -le

– 暗黙、明示的なキャスト、強制

• 正規表現を使ったマッチング

– Select-String

3737

出力と書式

• リスト形式、表形式、ワド、カスタムビューのフォーマッタが用意されている

– Get-Command Format-*

• フォーマッタのオプションで、プロパテゖ、プロパテゖセット、プロパテゖの表現を指定可能

– get-process |format-table name,id,handlecount

– get-process |format-table Configuration -auto

– get-process |format-table name,@{ Label="File"; Expression= {$_.mainmodule.filename} }

– get-process |format-list name,*size64

• XML フゔルでフォーマット拡張を定義

– Update-FormatData My.Format.ps1xml

3838

ドラブ

• さまざまなデータストゕに、共通のゕクセス方法を提供

• データストゕは「ドラブ」として見える

– Filesystem, Registry, Alias, Certs, Env, Functions, Variables, …

– get-childitem HKLM:\SOFTWARE\Microsoft

• 「ドラブ」はさまざまな情報を含む名前空間

– Item, ChildItem, Content, Property, ACL, …

• 共通のコマンドレットでゕクセス可能また alias が既定で設定されている

Get-ChildItem dir ls

Get-Cwd cd pwd

Get-Content type cat

New-item –type directory mkdir mkdir

Set-Location cd cd

3939

ドラブのゕクセス方法

• ドラブ名、プロバダを指定して新しいドラブをマウント– new-drive -Name sys32 -Provider FileSystem

-root c:\windows\system32 -Description "PSH SOURCES"– set-location sys32:\drivers

• ワルドカード– get-childitem *\*\*.doc– get-childitem [a-f]*[tc]

• さまざまなプロバダで共通のゕクセス方法– get-childitem \logs –Include *.txt –Exclude A* -Recurse -Force

• 特定のプロバダで有効な拡張– get-childitem Cert: -Recurse –CodeSigning

• すべてのプロバダでタブ補完– get-childitem HKLM:\So<TAB>\Mi<TAB> =>

HLKM:\Software\Microsoft

4040

.NET スクリプテゖング

• すべての .NET の型が利用可能 (ゕセンブリの読み込みが必要な場合あり)

• .NET オブジェクトの生成

– $d = new-object System.DateTime 2007,4,20

– [DateTime] "2007/4/20"

• プロパテゖ、メソッドの確認

– [DateTime] "2007/4/20" | get-member

– [datetime].Getmembers() | where-object {$_.isStatic} | format-table name

• プロパテゖ、メソッドへのゕクセス

– プロパテゖ、メソッド

• $d.DayOfWeek

• $d.AddMonths(6)

– スタテゖックメソッド

• [DateTime]::Now

• [Math]::Sqrt(16)

4141

ADSI スクリプテゖング

• Windows PowerShell は ADSI のネテゖブゕクセスを提供

• ADSI オブジェクトにバンド

– $objDomain = [ADSI]"LDAP://localhost:389/dc=NA,dc=fabrikam,dc=com”

• ADSI オブジェクトの生成

– $objOU = $objDomain.Create("organizationalUnit", "ou=HR")

– $objOU.SetInfo()

• ADSI オブジェクトを変更

– $objOU.Put("description", "Human Resources")

– $objOU.SetInfo()

• ADSI オブジェクトを取得

– $objOU.Get("description")

• ADSI オブジェクトの削除

– $objDomain.Delete(“organizationalUnit”, “ou=HR”)

4242

オブジェクトユーテゖリテゖ

• Foreach-Object (繰り返し)

– get-process |foreach-object {$i = 0} {$i += $_.handles} { "Total: $i"}

• Group-Object (グループ化)

– get-process | group-object Company

• Measure-Object (集計)

– get-process | measure-object Handles –Sum –Ave –Min –Max

• Select-Object (選択)

– get-process | select-object name,id –expand modules

– get-process | sort-object handles |Select –first 10

• Where-Object (条件抽出)

– get-process | where-object {$_.handles –ge 500}

4343

WMI

• Get-WmiObject

– WMI 名前空間とのンターフェス

• Get-WmiObject –list [-Namespace xx]

• Get-WmiObject –Class win32_bios

– リモート接続可能

4444

ログの操作

• ベントログ– 読み取り

• Get-EventLog

– 書き込み• System.Diagnostics.EventLog クラスを利用

– $log = New-Object –Type System.Diagnostics.EventLog-ArgumentList System

$log.source = “日次処理”$log.WriteEntry(“正常に終了しました”, “Information”)

• エラー時にもベントを書き込み– ベントにタスクを添付して、復帰処理

• その他のログ– IIS

• 文字列処理• LogParser

4545

COM

• VBScript と同様に管理オブジェクトにゕクセス

• New-Object で COM オブジェクトを作成

– $fso= New-Object -Com Scripting.FileSystemObject

• プロパテゖ、メソッドの確認

– $fso | get-member

• プロパテゖ、メソッドへのゕクセス

– $fso.GetDrive("C:")

– $fso.VolumeName = "System Drive"

• パプでつないで利用

– $word = new-object –ComObject Word.Application

– $word.RecentFiles | sort-object name |format-table name, index,path -auto

4646

XML

• XML はネテゖブのデータ型

– $x=[xml]"<a><b><c>TEST</c></b></a>"

• データへのゕクセス方法が用意されている

– $x.a.b.c

• XML のプロパテゖへのゕクセスは PSBase 経由で

– $x.a.PSBase.innerXml

• XML メソッドへのゕクセス

– $x.a.SelectNodes("//c")

4747

引数と戻り値

• 名前付き引数、型付き引数

– $args で名前なし、型指定なしの引数

– 関数定義または param 文で引数の名前、型、既定値を設定

– 名前の一部指定でマッチング

– 引数の順序を考えなくてよい

– より安全なスクリプト

• 戻り値

– パプに出力されたものが戻り値になる

– デバッグ情報やユーザーへの情報はコンソールへ

4848

サンプル (1)

• WMI

– WMI のクラスリストから、文字列 Processor を含むクラスを抽出]

• gwmi -l | select-string "Processor“

– CPU の使用率を表示

• gwmi Win32_PerfFormattedData_PerfOS_Processor

– CPU の使用率から、コゕの番号、使用率(%)のみ表示

• gwmi Win32_PerfFormattedData_PerfOS_Processor | format-table name,PercentProcessorTime –auto

– 上記の出力を HTML に変換

• gwmi Win32_PerfFormattedData_PerfOS_Processor | select name,PercentProcessorTime | ConvertTo-Html

4949

サンプル(2)

– IE を COM オブジェクト経由で操作

• $ie = new-object -com internetexplorer.application

• $ie.visible = $true

• $ie.navigate("about:blank")

• $ie.document.body.innertext = "a"

– CPU の使用率を IE に表示させ、1秒ごとに更新

• while($true){$ie.document.body.innerhtml =(gwmi Win32_PerfFormattedData_PerfOS_Processor | select name,PercentProcessorTime | ConvertTo-Html ); sleep 1}

5050

サンプル(3)

• ベントログ

– システムログから最新10件を取得

• Get-EventLog system -Newest 10

– システムログの最新1000件をソースごとに集計し出現回数でソート

• Get-EventLog system -Newest 1000 |Group-Object Source | Sort-Object Count

– PowerGadgets (http://powergadgets.com) でグラフ化

• Get-EventLog system -Newest 1000 |Group-Object Source | Sort-Object Count | Out-Chart

5151

サンプル(4)

• Excel

– COM オブジェクト経由で操作

• $excel = new-object -com excel.application

• $excel.findfile()

• $excel.worksheets.item(1).cells.item(1,1)

– ExcelPackage で操作(http://www.codeplex.com/ExcelPackage)

• [Reflection.Assembly]::LoadFrom("$pwd\excelpackage.dll") | out-null

• $ep = New-ObjectOfficeOpenXml.ExcelPackage (dir vbs2ps.xlsx)

• foreach ($i in 1..5) {$ep.workbook.worksheets[1].Cell($i,1).value}

5252

サンプル(5)

• フゔルシステム監視

– PS Eventing(http://www.codeplex.com/PSEventing)

• . .\eventhandlers.ps1 (ユーテゖリテゖの読み込み)

• .\filesystemwatcher.ps1

• または

– $fsw = new-object system.io.filesystemwatcher

– $fsw.Path = "c:\temp“

– $fsw.EnableRaisingEvents = $true

– add-eventhandler (get-variable fsw) changed { param($var, $name) "changed!" }

– do-events # this will block until ctrl+C is hit

53

$lines = netstat.exe -ano -p TCP$ps = get-process

foreach ( $line in $lines ){

$obj = new-object System.Management.Automation.PSObject$obj.psobject.typenames[0] = "Netstat"

switch -regex ($line) {("^ TCP") {

$values = $line.trim().split(" ", [StringSplitOptions]::RemoveEmptyEntries)

$obj | add-member noteproperty "proto" $values[0]$laddr, $lport = $values[1].split(':')$obj | add-member noteproperty "laddr" $laddr$obj | add-member noteproperty "lport" ([int]$lport)$faddr, $fport = $values[2].split(':')$obj | add-member noteproperty "faddr" $faddr$obj | add-member noteproperty "fport" ([int]$fport)$obj | add-member noteproperty "state" $values[3]$obj | add-member noteproperty "pid" ([int]$values[4])$pname = ($ps | where {$_.id -eq $values[4]}).name$obj | add-member noteproperty "pname" $pname$obj

}("^ UDP") {

# TCPを参考に実装してみてください}

}}

例: Get-netstat.ps1

Recommended