ネットワーク共有フォルダの管理には管理者権限が必要

前回に引き続き、PowerShellとWMIを使ってネットワーク共有リソースを管理する方法を紹介します。共有リソースの設定を変更するとき、PowerShellにも管理者権限が必要ですので、[管理者として実行]でPowerShellを起動してください。

※「管理者として実行」については当記事の連載第20回を参照してください。

共有フォルダ設定の変更

PowerShellとWMIを使って既存の共有フォルダの設定を変更するためには、2つの方法があります。

1つは、Get-WmiObjectコマンドレットで共有オブジェクトを取得してから、そのSetShareInfoメソッド(メンバ関数)で設定する方法です。ただし、この方法で設定できるのは最大接続ユーザー数と、共有オブジェクトの説明文です。もう1つは、Get-WmiObject(省略形gwmi)で設定を変更したい共有オブジェクトを取得してから、共有オブジェクトのDeleteメソッド既存の共有を削除し、Createメソッドで共有を再作成します。残念ながら、現在のPowerShellで既存の共有リソースを変更する方法は、あまりスマートではありません。より詳細に管理するためには、自作のコマンドレットを作成するか、Windowsのnet shareコマンドをPowerShellから呼び出して起動します。

※ Createメソッドによる共有の作成については、当記事の連載第20回を参照してください。

Get-WmiObjectで取得する共有オブジェクトの絞り込み

「Get-WmiObject -Class Win32_Share」と実行すると、ローカルPCのすべての共有オブジェクトを配列として取得してしまいます。しかし、特定の共有の設定を変更するためには、目的の共有オブジェクトだけを抽出するのがいいでしょう。まず、条件を設定して目的の共有オブジェクトを検索する例を紹介します。

gwmi  -Class  Win32_Share

絞り込みなしの状態。Win32_Shareクラスのオブジェクトをまとめて取得すると、全共有オブジェクトを取得。

Get-WmiObjectでは-Filterオプションパラメータを使って、たとえば、NameプロパティがDataの共有オブジェクトを取得するには、次のように実行します。

gwmi  -Class  Win32_Share  -Filter  "Name='Data'"

-Filterオプションで、NameがDataの教諭オブジェクトだけを抽出。

-Filterオプションには、WQLのWHERE句の条件式を文字列として指定します。たとえば、条件を「プロパティ名=プロパティ値」として設定します。プロパティ値を文字列として指定し、さらに「プロパティ名=プロパティ値」という式自体も文字列として-Filterオプションに指定しなければならないことから、「"プロパティ名='プロパティ値'"」というように、シングルクォーテーションとダブルクォーテーションの入れ子にしなければなりません。また、条件にはANDやORなどの論理演算やLIKEなどのマッチ演算子を活用できます。

※ WQL(WMI Query Language)はWMIで条件検索を行うためのクエリー言語です。詳細はMicrosoft TechNet等でWMI関連資料を参照してください。

gwmi  -Class Win32_Share -Filter "Name='Data' AND Description='共有データベース'"

Nameプロパティが「Data」で、かつDescriptionプロパティが「共有データベース」の共有オブジェクトを抽出。

「Like 'D%'」で、Dで始まる文字列に絞り込みます。

gwmi  -Class Win32_Share -Filter "Name Like 'D%'"

%は、WQLにおいてPowerShellやWindowsのワイルドカードの*に似た働きをします。

WQLに不慣れであれば、Get-WmiObjectからパイプラインでWhere-Object(省略形where)に繋いで絞り込みます。

gwmi  -Class  Win32_Share | where {$_.Name -eq "Data"}

Get-WmiObjectで取得した共有オブジェクト配列から、Nameプロパティが「Data」に一致する共有オブジェクトを抽出。

gwmi  -Class  Win32_Share | where {$_.Description -like "共有*"}

Descriptionプロパティが、「共有」で始まる文字列の共有オブジェクトを抽出。

gwmi  -Class  Win32_Share | where {($_.Description -like "共有*") -and  ($_.Type -eq 0)}

Descriptionプロパティが「共有」で始まり、Typeプロパティ(共有の種類)が0(ディスク共有)の共有オブジェクトを抽出。

※ Where-Objectについては、第20回記事を参照してください。

SetShareInfoメソッドによる変更

上記のようにGet-WmiObjectコマンドレットで設定を変更する共有リソースの共有オブジェクトを取得し、共有オブジェクトのSetShareInfoメソッド(メンバ関数)で設定を変更します。

いったん、Get-WmiObjectで取得したオブジェクトを表示させて、1つの共有オブジェクトに絞り込まれていることを確認してから、もう一度Get-WmiObjectの結果を変数に代入して活用するといいでしょう。

(1)取得する共有オブジェクトが1つに絞り込まれていることを確認します。

gwmi   -Class Win32_Share | where {$_.Name  -like  "Doc*"}

1つだけ表示することを確認。

(2)取得した共有オブジェクトを変数に代入します。(この例では変数名s)

$s = Get-WmiObject -Class Win32_Share | where {$_.Name  -like  "Doc*"}

変数sに代入。

(3)sに代入した共有オブジェクトのSetShareInfoを実行して設定します。SetShareInfoでは、同時アクセス数の制限および共有の説明文を変更できます。書式は以下の通りです。

SetShareInfo(最大アクセス数, 説明文)

ここでは、最大アクセス数を10、説明文に「共有文書」と設定してみます。

$s.SetShareInfo(10, "共有文書")

SetShareメソッドを実行。

(4)もう一度Get-WmiObjectを実行して設定結果を確認。

共有フォルダDocumentsの設定が変更されています。

もちろん、変数を介さずに、直接SetShareInfoメソッドを使用することもできます。

(Get-WmiObject -Class Win32_Share | where {$_.Name  -like  "public*"}).SetShareInfo(10, "共有文書")

Deleteメソッドによる共有の削除

共有リソースを削除するには、Deleteメソッドを実用します。

上記のSetShareメソッドを使用するときと同様に、まず変数に目的の共有オブジェクトを代入して、Deleteメソッドを実行します。

(1)現在の共有設定を確認。transfilesという共有フォルダがあります。

gwmi  -Class Win32_Share

現在の共有設定を確認。

(2)変数sにtransfilesの共有オブジェクトを保存します。

$s = Get-WmiObject -Class Win32_Share | where {$_.Name  -like  "trans*"}

変数sに共有フォルダtransfilesの共有オブジェクトを代入。

(3)Deleteメソッドで共有フォルダtransfilesを削除します

$s.Delete()

Deleteメソッドを実行。()を省略することはできません。

(4)transfilesの共有設定が解除されたことを確認します。

共有設定transfilesが解除されて、なくなっています。

net shareコマンドの活用


より詳細に共有リソースを管理するためには、net shareコマンドやnet useコマンドを使うといいでしょう。Windowsの外部コマンドですので、コマンドプロンプトまたはPowerShellから実行することもできます。ただし、共有設定を管理するnet shareコマンドはWindows Server 2003以降で導入されたコマンドですので、Windows XPまでのWindowsでは、net useコマンドを使います。net useコマンドは、Windows 2000以降の全Windowsで使えます。

net share、net useの使い方については、それぞれ「net share /?」、「net use /?」と実行してヘルプを確認してください。