PowerShellスクリプト(ps1)の実行を許可するには
IaaSのサーバではそのままで実行OK
Windows PowerShell スクリプトを実行する
> Set-ExecutionPolicy RemoteSigned
![set-execpol.png]()
取得した情報を変数として引き渡すには、|(パイプ)と()を使う
Windows PowerShell の機能
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
ZV46977
GN20309
RT04808
: ※ MIND-AD ドメインのユーザー情報も全て取得してしまう。
WMI Class
Retrieving a WMI Class (Windows)
Win32_Account class (Windows) グループのほう
Win32_UserAccount class
Win32_UserAccount の各プロパティの説明
512 は AccountType が Normal account であることを示す。
※ MIND-AD ドメイン参加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 のみ抽出するよう指定すればよい。
これだと、ホスト名も影響しないので、実行サーバが変わっても大丈夫。
DSP-PC2081 でインスタンスを指定せずに実行すると 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
H215015 DSP-PC2081\H215015 512 S-1-5-21-2989615179-323239334-30... DSP-PC2081
QNDSYS16 DSP-PC2081\QNDSYS16 512 S-1-5-21-2989615179-323239334-30... DSP-PC2081
___VMware_Con... DSP-PC2081\___VMware_Conv_SA___ 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 DSP-PC2081\Administrator
Guest DSP-PC2081\Guest
H215015 DSP-PC2081\H215015
QNDSYS16 DSP-PC2081\QNDSYS16
___VMware_Conv_SA___ DSP-PC2081\___VMware_Conv_SA___
★★★ Issue
取得したユーザーアカウントのリストを使って、net user コマンドを実行できるようにする。
net user コマンドに、ユーザー名を $_ で渡しても「このコマンドの構文は次のとおりです」となってユーザー情報が取得できない。
net user の代わりに echo $_ 等を実行すると、userlist2.txt の各行をechoコマンドで表示できている。
$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 "---------------------------------------"}
★★★ Solve
.net - What's wrong with my foreach loop? - Stack Overflow
$_ を使わない方法にした
$UserList = Get-CimInstance -Query "select * from Win32_UserAccount where LocalAccount = 'true'"
foreach ($User in $UserList)
{
net user $User.Name;
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