Hey, Scripting Guy!

Scripting Guys が皆さんの質問にお答えします

Hey, Scripting Guy!

TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

詳細情報

Hey, Scripting Guy! カテゴリ別アーカイブ

Hey, Scripting Guy! 日付別アーカイブ

Hey, Scripting Guy! ダウンロード (英語)

Spacer

*

Windows PowerShell を使用して Guest アカウントの状態を確認する方法はありますか

Hey, Scripting Guy! Question

Scripting Guy さん、よろしくお願いします。Windows PowerShell を使用して、コンピュータ上で Guest アカウントが無効になっているかどうかを確認する方法はありますか。

-- RB

SpacerHey, Scripting Guy! AnswerScript Center

RB さん、こんにちは。先週の今頃、このコラムを執筆している Scripting Guy は休暇中でした。休暇中は、主に日向ぼっこして過ごし、ごくたまにテレビを見て過ごしました。先週、彼が対処しなければならなかった一番手ごわい質問は、「お父さん、昼食を作るの、それとも外に食べに行くの」でした。

実際には、とても簡単に答えることのできる質問でしたが。

でも、それはそのときだけの話しで、今は事情が違います。先週、この Scripting Guy は、サンドイッチを作るか買いに行くかを決めなければなりませんでした。今週は、Windows PowerShell を使用して、コンピュータ上で Guest アカウントが無効になっているかどうかを確認する方法を決めなければなりません。それはないですよね。

この質問に答えるのが難しいのはなぜでしょうか。少なくとも「仕事をするのと、だれかに仕事をさせるのはどちらがいいですか」という質問よりも答えるのが難しいです。そうですね。問題は、Windows PowerShell には、ローカル ユーザー アカウントを使用して作業するための cmdlet が組み込まれていないことです。そのため、ローカル ユーザー アカウントを使用して作業する場合は少し注意が必要ですが、.NET Framework を使用する、(複雑ではありますが) 驚くほど巧妙な解決策につながりました (cmdlet が何なのかわからない場合や、さらに Windows PowerShell が何なのかもわからない場合は、スクリプト センターの「Windows PowerShell の機能」を参照してください)。

確かに、場合によっては、このような巧妙で複雑な解決策が必要です。たとえば、.NET Framework を使用せずにユーザーのパスワードを簡単に変更する方法はないようです。ところが、幸いにも今回のご質問はこれに該当しません。コンピュータ atl-fs-01 の Guest アカウントの状態を知りたい場合は、次のコードだけで十分です。

Get-WmiObject Win32_UserAccount -computername "atl-fs-01" -filter "LocalAccount=True AND Name='Guest'" |  
Select-Object Domain,Name,Disabled

: このコラムで紹介した Windows PowerShell のコマンドはすべて 1 行に入力する必要があります。

ここでは、コンピュータ atl-fs-01 の Guest アカウントに関する情報を取得するために Get-WMIObject cmdlet (および Win32_UserAccount クラス) を使用しています。おわかりのように、Get-WMIObject は、ここでの目的に対して、正しく動作しています。つまり、ローカル ユーザー アカウントの一部またはすべてに関する情報を簡単に返すことができます。ただし、これは皆さんの好みに合わない可能性があることをお伝えしておく必要があります。これには少なくとも 2 つの理由があります。

1 つの理由は、ここで使用した –filter パラメータが Windows XP および Windows Server 2003 でしか動作しないということです。LocalAccount プロパティをサポートするオペレーティング システムはこの 2 つだけです。Windows 2000 コンピュータでこのコマンドを実行するには、Windows PowerShell をインストールしておくだけでなく、–filter パラメータを変更する必要もあります。

もう 1 つの理由は、Win32_UserAccount クラスにはいくつかの制限があるということです。特に顕著なのは、ユーザーのパスワードを設定または変更できないことです。つまり、この WMI クラスは、ADSI の代用や WinNT プロバイダとして使用することはできません。ただし、救いとして、Win32_UserAccount のプロパティの多くは読み取り/書き込みが可能なので、無効になっているアカウントを有効にするようなこともできます。この特定のコマンドについて詳しく説明することはしませんが、Windows PowerShell を使用して Guest アカウントを有効にする少なくとも 1 つの方法を次に示します。

$a = Get-WmiObject Win32_UserAccount -computername "atl-fs-01" -filter "LocalAccount=True AND Name='Guest'"; 
 $a.disabled=$false; $a.Put()

: なぜ Guest アカウントを有効にする "少なくとも 1 つの方法" と言ったのでしょうか。それは、通常 Windows PowerShell には、最終的な目標に対していくつかの方法が用意されているからです。別の方法ですか。もっと良い方法を知っているなら教えてください。近いうちに、「Hey, Wait a Minute, Scripting Guy!」という新しい特集記事でこのコラムの代替案や改善点を特集する予定です。

ただし、注意や警告は別として、少し前に示した最初のコマンドは、Guest アカウントとその状態に関する情報を返します。これは、あなたがなんとかしてやりたかったことです。

Domain             Name                        Disabled 
------             ----                        -------- 
ATL-FS-01          Guest                       True

良い質問です。このコマンドがどうやって動作するか、ですね。まず、実際にはここに "2 つ" のコマンドがあることに注意してください。この 2 つのコマンドは、Windows PowerShell パイプライン (| 文字) を使用して関連付けられています。パイプラインの左側では、Get-WMIObject cmdlet を使用して Win32_UserAccount クラスから情報を取得します。使用する WMI クラスを指定するだけでなく、Get-WMIObject に次の 2 つのパラメータも渡します。

-computername "atl-fs-01" : もちろん、これは目的のコンピュータの名前です。ローカル コンピュータの情報を取得するには、このパラメータを省略するだけです。

-filter "LocalAccount=True AND Name='Guest'" : これは、WQL クエリの ("Where" という単語を除いた) Where 句と同じです。ご覧のとおり、返されるデータを制限しています。LocalAccount プロパティが True で、Name プロパティが Guest である、Win32_UserAccount クラスのインスタンスを返すように要求しているだけです。簡単でしょう。

Guest アカウントのすべてのプロパティ (Disabled プロパティを含む) を取得する場合に必要なのは、Get-WMIObject コマンドだけです。ただし、Get-WMIObject コマンドは、Guest アカウントのすべてのプロパティを表示するには十分ではありません。結局のところ、Windows PowerShell では、表示するデータ (およびその表示方法) を指定する XML ファイルを使用できます。既定では、Windows PowerShell は、多くの WMI クラス (Win32_UserAccount を含む) の形式を事前に設定しています。コマンドの左側のみを使用する場合、最終的に次のようなデータが返されます。

AccountType : 512 
Caption     : ATL-FS-01\Guest 
Domain      : ATL-FS-01 
SID         : S-1-5-21-1292428093-1580436667-725345543-501 
FullName    : 
Name        : Guest

すばらしいですが、この出力ではアカウントが無効になっているかどうかが正確にわかりません。

でも、がっかりしないでください。Windows PowerShell には、既定のフォーマッタを上書きする方法も多数用意されています。たとえば、目的の情報を取得し、その情報を Select-Object cmdlet に渡します。そこから、Select-Object cmdlet を使用して、目的のプロパティを取得 (および表示) できます。

Select-Object Domain,Name,Disabled

上記のコードで、まさにこの処理が行われました。

さて、退社時間まで 2 時間になりました。私たちはもう 1 つ厄介な質問を抱えています。明日のコラムを先に始めるか、それとも早く家に帰るか。決めることがたくさんあります…


ページのトップへページのトップへ