PowerShellスクリプト(ps1)の実行を許可するには
> Set-ExecutionPolicy RemoteSigned
取得した情報を変数として引き渡すには、|(パイプ)と()を使う
if と switch
Windows PowerShell If Statement. Also 'Else and 'ElseIf' constructions
Windows PowerShell - Switch Statement Examples
特定のファイルが存在しているかどうかで処理を分岐させる
ファイルやフォルダが存在するかを確認する方法[PowerShell] : バヤシタ
標準出力とエラー出力、リダイレクトのまとめ
http://www.itlab51.com/?p=5595
about_WQL
https://technet.microsoft.com/ja-jp/library/jj679341.aspx
WQL は、Windows Management Instrumentation (WMI) のクエリ言語であり、WMI から情報を取得するために使用します。
WQL を使用するために必要な基本的な WQL ステートメントは、Select、Where、および From です。
Get-WmiObject で使用できる WQL クエリは、すべて Get-CimInstance でも使用できます。
Windows PowerShell 3.0 で導入された CIM コマンドレットは、WMI コマンドレットと同じタスクを実行します。CIM コマンドレットは、WS-Management (WSMan) 標準と Common Information Model (CIM) 標準に準拠しています。
そのため、コマンドレットは、Windows コンピューターと他のオペレーティング システムを実行しているコンピューターを、同じ手法で管理できます。
Get-WmiObject は ManagementObject を返しますが、Get-CimInstance は CimInstance オブジェクトを返します。ただし、どちらのオブジェクトも非常に似ています。
Wmi-Object と CimInstance は同じように使えるが、 CimInstance のほうが新しく作られた汎用的なコマンドレット・・・かな?
Get-WmiObject または Get-CimInstance で、-ClassName と -Property のパラメータを指定する場合と、-Query で WQL を使用する場合は得られる結果にあまり違いがない。
ClassName が Win32_UserAccount のような、値の件数が多いケースで必要な項目の値だけを取得したい場合は、-Query や -Property で項目を指定するのではなく、
取得した値(のリスト)をパイプでSelectに引き渡してた方が、不要な項目名が無い状態で値を取得できる。(最後の実行例)
PS C:\Windows\system32> Get-CimInstance -ClassName Win32_Bios
SMBIOSBIOSVersion : L01 v02.53
Manufacturer : Hewlett-Packard
Name : Default System BIOS
SerialNumber : JPA50796NS
Version : HPQOEM - 20141020
PS C:\Windows\system32> Get-CimInstance -Query "Select * from Win32_Bios"
SMBIOSBIOSVersion : L01 v02.53
Manufacturer : Hewlett-Packard
Name : Default System BIOS
SerialNumber : JPA50796NS
Version : HPQOEM - 20141020
PS C:\Windows\system32> Get-CimInstance -ClassName Win32_Bios -Property Name
Status :
Name : Default System BIOS
Caption :
SMBIOSPresent :
Description :
InstallDate :
BuildNumber :
CodeSet :
IdentificationCode :
LanguageEdition :
Manufacturer :
OtherTargetOS :
SerialNumber :
SoftwareElementID : Default System BIOS
SoftwareElementState : 3
TargetOperatingSystem : 0
Version : HPQOEM - 20141020
PrimaryBIOS :
BiosCharacteristics :
BIOSVersion :
CurrentLanguage :
InstallableLanguages :
ListOfLanguages :
ReleaseDate :
SMBIOSBIOSVersion :
SMBIOSMajorVersion :
SMBIOSMinorVersion :
PSComputerName :
CimClass : root/cimv2:Win32_BIOS
CimInstanceProperties : {Caption, Description, InstallDate, Name...}
CimSystemProperties : Microsoft.Management.Infrastructure.CimSystemProperties
PS C:\Windows\system32> Get-CimInstance -Query "Select Name from Win32_Bios"
SMBIOSBIOSVersion :
Manufacturer :
Name : Default System BIOS
SerialNumber :
Version : HPQOEM - 20141020
PS C:\Windows\system32> Get-CimInstance -ClassName Win32_Bios | Select Name
Name
----
Default System BIOS
PS C:\Windows\system32> Get-CimInstance -ClassName Win32_UserAccount | select Name
Name
----
Administrator
Guest
H215015
QNDSYS16
___VMware_Conv_SA___
Administrator
Guest
krbtgt
SUPPORT_388945a0
melitdssadm
melitdsssys
melitdssusertemp
sysBackupexec
AD-USER01
AD-USER02
AD-USER03
:
※ 実行機の参加しているドメインのユーザー情報も全て取得してしまう。
WMI Class
Retrieving a WMI Class (Windows)
Win32_Account class (Windows) グループのほう
Win32_UserAccount の各プロパティの説明
512 は AccountType が Normal account であることを示す。
※ ドメイン参加PCでGet-CimInstance を実行するとドメインユーザー情報を取得してしまうので注意すること
たぶん↓の注記はこのことを言っている?
Note Because both the Name and Domain are key properties, enumerating Win32_UserAccount on a large network can negatively affect performance. Calling GetObject or querying for a specific instance has less impact.
GetObject はVBScriptでしか使えない。Queryでインスタンスを特定するには、以下のコマンド例のように、whare で LLocalAccount が Trure のみ抽出するよう指定すればよい。
これだと、ホスト名も影響しないので、実行サーバが変わっても大丈夫。
手元のPCでインスタンスを指定せずに実行すると 30分以上かかっていた処理が、一瞬で完了するようになった。(ADのユーザー情報を取得していないためと思われ)
本番稼動中のサーバで、万が一、ドメインに参加しているサーバだったとしても、負荷の心配なく実行できる。
PS C:\Windows\system32> get-ciminstance -query "select * from Win32_UserAccount where LocalAccount = 'true'"
Name Caption AccountType SID Domain
---- ------- ----------- --- ------
Administrator DSP-PC2081\Administrator 512 S-1-5-21-2989615179-323239334-30... DSP-PC2081
Guest DSP-PC2081\Guest 512 S-1-5-21-2989615179-323239334-30... DSP-PC2081
LocalUser01 DSP-PC2081\LocalUser01 512 S-1-5-21-2989615179-323239334-30... DSP-PC2081
LocalUser02 DSP-PC2081\LocalUser02 512 S-1-5-21-2989615179-323239334-30... DSP-PC2081
比較実行例: インスタンスを指定せず、QueryのフィルタやLocalAccount 以外のインスタンスの指定方法を試した場合
このコマンドの実行結果では、結果的にMIND-AD ドメインのユーザー情報は出力されないが、完了するまでに30分程度かかっているのでADユーザー情報が処理対象から除外されているわけではない。
構築中のサーバはドメイン非参加のため問題ないが、本番稼動中のサーバでは注意が必要。
PS C:\Windows\system32> get-ciminstance -query "select * from Win32_UserAccount where Domain like '$env:computername'" | select Name, Caption
Name Caption
---- -------
Administrator PC2081\Administrator
Guest DSP-PC2081\Guest
LocalUser01 DSP-PC2081\LocalUser01
LocalUser02 DSP-PC2081\LocalUser02
全ユーザーの "net user" コマンド実行結果を取得する
取得したユーザーアカウントのリストを使って、net user コマンドを実行できるようにスクリプトを作成する。
(echo は出力結果を見やすくするため)
$UserList = Get-CimInstance -Query "select * from Win32_UserAccount where LocalAccount = 'true'"
foreach ($User in $UserList)
{
net user $User.Name;
echo "---------------------------------------"
}
net user コマンドに、ユーザー名を $_ で渡しても「このコマンドの構文は次のとおりです」となってユーザー情報が取得できない。
net user の代わりに echo $_ 等 他のコマンドで実行すると、userlist2.txt の各行をechoコマンドで表示できているが net user はダメ。
$dir="C:\IaaSadmin\"
Get-CimInstance -Query "select * from Win32_UserAccount where LocalAccount = 'true'" | Select Name > $dir"userlist.txt"
(cat C:\IaaSadmin\userlist.txt)[3..((cat C:\IaaSadmin\userlist.txt).Length-3)] > $dir"userlist2.txt"
cat $dir"userlist2.txt" | Foreach-Object {net user $_;echo "---------------------------------------"}
ローカル ユーザー アカウント情報の取得
★ PowerShellでCIM cmdletを用いて対象PCのユーザーや所属するユーザーグループを調べる - tech.guitarrapc.cóm
https://technet.microsoft.com/en-us/library/jj590758.aspx
Windows OS入門:第1回 ユーザーとグループアカウント (2/2) - @IT
Windowsローカルユーザーのパスワード有効期限確認用PowerShellスクリプト - YOMON8.NET
WMI と Windows PowerShell を使用してユーザーの SID を取得する方法はありますか
後述のローカル セキュリティ ポリシーを取得するコマンドの実行結果で、ユーザー権利の割り当て等に設定されているユーザーがアカウント名ではなくSIDで出力されているため
SIDとユーザーアカウント名の紐付けのために、SIDも出力したファイルも出しておくといいかも?
Get-Content(cat)を使って、テキストファイルの任意の行を抽出する
上記方法で取得したユーザーアカウント一覧のテキストファイルから不要な先頭の3行を除いて、変数リストとして使えるようにする。
PowerShell/テキストファイルの指定した範囲を抽出する・Get-Content - Windowsと暮らす
PowerShell/テキストファイルの行数を取得する方法・Get-Content - Windowsと暮らす
get-ciminstance -query "select * from Win32_UserAccount where Domain like '$env:computername'" | select Name > $dir"userlist.txt"
(cat C:\IaaSadmin\users.txt)[3..((cat C:\IaaSadmin\users.txt).Length)] > $dir"userlist2.txt"
Get-CimInstance の実行結果をテキストファイルに出力し、4行目から最終行までを新しいテキストファイルに出力する。
空白行を削除
PowerShell: ◆テキストファイルから空行を取り除く
読み込んだファイルから空白行を除いて新しいファイルに出力する。
このとき、読み込んだファイルと同じファイル名を新しい出力ファイル名にすることはできないため、新しいファイルを出力後に不要であれば元ファイルはrmする。
例)
wmic SERVICE get "Name,DisplayName,StartMode,Startname,PathName,State" /TRANSLATE:NoComma /format:csv > $dir"service_b.csv"
Select-String -Pattern "\S" -Path $dir"service_b.csv" | %{$_.line} >service.csv
rm $dir"service_b.csv"
WMIC コマンド
Windows wmic command line command
WMIC - Windows Management | Windows CMD | SS64.com
サーバーの役割と機能
Get-WindowsFeature
インストールされたプログラムの一覧を取得(WMIインストーラでインストールされたもののみ=プログラムと機能の一覧に表示されるもの)
get-wmiobject -class win32_product | format-list -property Name, Vendor, Version, installdate
https://www.petri.com/command-line-wmi-part-1
https://www.petri.com/command-line-wmi-part-3
ローカル セキュリティ ポリシー
secedit コマンドによるローカルセキュリティポリシーの操作 | 俺的備忘録 〜なんかいろいろ〜
どうやら、この一覧を見る限りPowerShellのコマンドレットにはグループセキュリティについて操作できるものはあっても、ローカルセキュリティポリシーについて操作するものは無いようだ。
一覧の取得は可能
例) コマンド実行時のカレントディレクトリにセキュリティ
> secedit /export /areas SECURITYPOLICY /cfg secedit.txt
項目名が全て英語だが、出力は一瞬で終わる。
diff
PowerShellで2つのファイルを比較する - Qiita
リモートサーバ上での操作
「クライアント側の信頼登録」
Set-Item WSMan:\localhost\Client\TrustedHosts -Value *
「リモート接続コマンド」
Enter-PSSession -ComputerName <HostIP or HostName> -Credential <HostIP or HostName>\<UserName>
パフォーマンスカウンタの取得
https://technet.microsoft.com/ja-jp/library/hh849685.aspx
https://technet.microsoft.com/ja-jp/magazine/ee872428.aspx
例)
> Get-counter -Counter "\Memory\Committed Bytes" -SampleInterval 120 –Continuous
> Get-counter -Counter "\Memory\Available MBytes" -SampleInterval 120 –Continuous
> Get-counter -Counter "\Memory\% Committed Bytes In Use" -SampleInterval 120 –Continuous
スクリプト例)
## -----------------------------------------------------------------------------------
## Windows Server 2012 R2 設定パラメータ採取用スクリプト
## Ver.1.1
## 【作成】2016/08/01 Shiozawa
## 【更新】2016/08/30 Shiozawa
## 【更新メモ】service.csvに出力されてしまう空白行の除外処理を追加
## -----------------------------------------------------------------------------------
$date=get-date -format yyyyMMdd
$hostname=hostname
$dir="C:\IaaSadmin\"+$date+"_"+$hostname+"\"
mkdir $dir
##############################################
# OS基本情報
##############################################
echo ------------ システム情報 ------------ >> $dir"osinfo.txt"
systeminfo | select-string -notmatch "KB" >> $dir"osinfo.txt"
echo - - - >> $dir"osinfo.txt"
echo ------------ ページファイル ------------ >> $dir"osinfo.txt"
Get-WmiObject -Class Win32_PageFileusage | Select-Object -Property Name, AllocatedBaseSize, CurrentUsage >> $dir"osinfo.txt"
## $(Get-ChildItem -force "c:\pagefile.sys").Length / 1048576
## pagefile.sys の作成場所が Cドライブ以外に指定されている場合はパスを修正してください。
echo - - >> $dir"osinfo.txt"
echo ------------ Disk ------------ >> $dir"osinfo.txt"
echo - >> $dir"osinfo.txt"
echo Cドライブ >> $dir"osinfo.txt"
fsutil volume diskfree C: >> $dir"osinfo.txt"
echo - >> $dir"osinfo.txt"
echo Dドライブ >> $dir"osinfo.txt"
fsutil volume diskfree D: >> $dir"osinfo.txt"
echo - - - >> $dir"osinfo.txt"
echo ------------ NTP設定 ------------ >> $dir"osinfo.txt"
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters" /v "NtpServer" >> $dir"osinfo.txt"
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters" /v "Type" >> $dir"osinfo.txt"
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config" /v "MaxAllowedPhaseOffset" >> $dir"osinfo.txt
w32tm /query /configuration >> $dir"osinfo.txt"
echo - - - >> $dir"osinfo.txt"
echo ------------ hosts ------------ >> $dir"osinfo.txt"
cat C:\Windows\system32\drivers\etc\hosts >> $dir"osinfo.txt"
echo - - - >> $dir"osinfo.txt"
echo ------------ EventLog_Settings ------------ >> $dir"osinfo.txt"
echo "maxsize = 20971520 = 20480 KB" >> $dir"osinfo.txt"
echo "retention=false かつ autoBackup=false のとき ⇒ 必要に応じてイベントを上書きする" >> $dir"osinfo.txt"
echo "retention=true かつ autoBackup=true のとき ⇒ イベントを上書きしないでログをアーカイブする" >> $dir"osinfo.txt"
echo "retention=true かつ autoBackup=false のとき ⇒ LOG_MAX_ACT=イベントを上書きしない" >> $dir"osinfo.txt"
wevtutil gl Application >> $dir"osinfo.txt"
echo - - >> $dir"osinfo.txt"
echo --------------------------------------- >> $dir"osinfo.txt"
wevtutil gl Security >> $dir"osinfo.txt"
echo - - >> $dir"osinfo.txt"
echo --------------------------------------- >> $dir"osinfo.txt"
wevtutil gl System >> $dir"osinfo.txt"
echo - - >> $dir"osinfo.txt"
echo - - - >> $dir"osinfo.txt"
echo ------------ Hotfix ------------ >> $dir"osinfo.txt"
get-hotfix >> $dir"osinfo.txt"
##############################################
# ユーザーとグループ
##############################################
echo ------------ Local_Users ------------ >> $dir"users.txt"
$UserList = Get-CimInstance -Query "select * from Win32_UserAccount where LocalAccount = 'true'"
Get-CimInstance -Query "select * from Win32_UserAccount where LocalAccount = 'true'" | Select Name,SID > $dir"users.txt"
echo --------------------------------------- --------------------------------------- >>$dir"users.txt"
foreach ($User in $UserList)
{
net user $User.Name >>$dir"users.txt";
echo "---------------------------------------" >>$dir"users.txt"
}
echo ------------ Local_Group ------------ >> $dir"users.txt"
net localgroup >> $dir"users.txt"
echo - - - >> $dir"users.txt"
net localgroup Administrators >> $dir"users.txt"
echo - - >> $dir"users.txt"
echo ------------------------ >> $dir"users.txt"
net localgroup "Remote Desktop Users" >> $dir"users.txt"
echo - - >> $dir"users.txt"
echo ------------------------ >> $dir"users.txt"
net localgroup "Power Users" >> $dir"users.txt"
echo ------------------------ >> $dir"users.txt"
net localgroup "Users" >> $dir"users.txt"
##############################################
# ネットワーク
##############################################
echo ------------ Interface ------------ > $dir"network.txt"
netsh interface tcp show global >> $dir"network.txt"
echo - - - >> $dir"network.txt"
netsh interface ipv4 show interface >> $dir"network.txt"
# netsh interface ipv4 show interface Management-LAN >> $dir"network.txt"
# netsh interface ipv4 show interface Service-LAN >> $dir"network.txt"
echo - - - >> $dir"network.txt"
echo ------------ IPconfig ------------ >> $dir"network.txt"
ipconfig /all >> $dir"network.txt"
echo - - - >> $dir"network.txt"
echo ------------ Firewall ------------ >> $dir"network.txt"
netsh advfirewall show allprofiles >> $dir"network.txt"
echo - - - >> $dir"network.txt"
echo ------------ Route_Table ------------ >> $dir"network.txt"
route print >> $dir"network.txt"
##############################################
# 役割と機能
##############################################
import-module servermanager
Get-WindowsFeature | select Path,Installed | Export-Csv -Encoding Default $dir"feature.csv"
##############################################
# インストールプログラム情報
# ※ [プログラムの追加と削除]も併せて確認すること
##############################################
Get-WmiObject -Class Win32_Product | Select Name,Version | Format-List >> $dir"winobject.txt"
##############################################
# タスクスケジューラ
##############################################
schtasks /query /v /fo csv >> $dir"tasksch.csv"
##############################################
# サービス
##############################################
wmic SERVICE get "DisplayName,Name,PathName,StartMode,StartName,State" /TRANSLATE:NoComma /format:csv > $dir"service_b.csv"
Select-String -Pattern "\S" -Path $dir"service_b.csv" | %{$_.line} > $dir"service.csv"
rm $dir"service_b.csv"
##############################################
# 特定フォルダの内容確認
##############################################
# tree C:\<dir name> /f >> $dir"dir-name.txt"
##############################################
# その他
##############################################
echo 情報採取が終了しました。
echo 出力フォルダ:$dir
echo 必要に応じて各種情報を手動で採取/確認してください。
echo -
echo "コンピュータの管理 compmgmt.msc"
echo "ローカルセキュリティポリシー secpol.msc"
echo "サービス services.msc"
echo -
echo "Windows Update wuapp"
echo "プログラムの追加と削除 appwiz.cpl"
echo "インターネット オプション inetcpl.cpl"
echo "グループ ポリシー gpedit.msc"
echo -
echo "ディスクの管理 diskmgmt.msc"
echo "タスクスケジューラ control schedtasks"
echo -
echo "環境変数は、[msinfo32.exe] を起動 → [ソフトウエア環境] → [環境変数] で"
echo "[全てを選択] → コピーしてテキストファイルに保存してください。"
## // Get-childitem env: