ネットワーク共有フォルダはWMIで

PowerShellでネットワーク共有フォルダの情報を取得、あるいはネットワーク共有フォルダを設定するには、WMIオブジェクトを取得して使います。WMIの活用については、当連載第15回のシステム情報取得を参照してください。

なお、共有設定を変更するとき(後述のCreateメソッドなどの実行時)は、管理者権限が必要になります。あらかじめ、PowerShellを管理者モードで起動しておくといいでしょう。

スタートメニューの[Windows PowerShell]を右クリックし、[管理者として実行]をクリック。

共有情報の取得

ローカルPCの共有情報の取得は簡単です。Get-WmiObject(省略形gwmi)コマンドレットで、共有情報のクラスWin32_Shareを指定します。

gwmi  -Class  Win32_Share

Win32_Shareクラスのオブジェクトを取得。

項目名Nameは共有名、Pathがローカル上のパスです。共有名の末尾に$マークがついている共有はシステム共有ですので、設定を変更しないでください。

※ システム共有の設定を変更した場合、Windows標準のネットワーク機能の一部が使用できなくなる場合があります。

他コンピュータの共有情報の取得

WMIオブジェクトを使って他コンピュータの共有情報を取得することもできます。WMI自体はPowerShellとは全く別のインタフェースですので、WMIの機能を使ってネットワーク接続する場合、相手先コンピュータでPowerShellが稼働している必要はありません。ネットワークアクセス許可さえ設定されていれば、PowerShellをインストールしていないコンピュータからも情報を取得できます。コンピュータ名(ホスト名)は、-ComputerName パラメータで指定します。

gwmi  -Class Win32_Share  -ComputerName  コンピュータ名

コンピュータ名 p-server の共有情報を取得。

ただし、他コンピュータにアクセスするには、資格情報(ユーザー認証)が必要な場合もあります。そのときは、Get-Credentialで資格情報のオブジェクトを作成してから、Get-WmiObjectコマンドレットに-Credentialパラメータで認証情報を与えます。

$c = Get-Credential

Get-Credentialコマンドレットを実行すると、ユーザー名とパスワードを求める「資格情報の要求」ウィンドウを表示します。

この例では、「資格情報の要求」ウインドウにユーザー名とパスワードを入力すると、ユーザー名情報とパスワード情報を資格情報オブジェクトとして生成し、変数cに代入します。この変数cをGet-WmiObjectコマンドレットに-Credentialパラメータで引き渡すことで、資格情報を使って相手先コンピュータに接続できます。

gwmi  -Class Win32_Share  -ComputerName  コンピュータ名 -Credential  $c

資格情報を使用してコンピュータ p-server の情報を取得。

変数を媒介させずに直接Get-WmiObjectで相手先コンピュータに接続したいときは、次の様に実行します。前述の実行と結果は同じです。このコマンドライン実行時に「資格情報の要求」ウインドウを開きます。

gwmi  -Class  Win32_Share  -ComputerName  コンピュータ名  -Credential  (Get-Credential)

Get-Credentialコマンドレット使用上の註意

Get-Credentialをパラメータなしで実行すると「資格情報の要求」ウインドウでユーザー名とパスワードの両方を問い合わせますが、Get-Credential実行時にユーザー名を指定すると、あらかじめユーザー名を設定したスタイルで「資格情報の要求」ウインドウを開きます。

$c = Get-Credential  ユーザー名

Get-Credential Administratorと実行した例。

ユーザー名については DomainName\UserName 、あるいは ComputerName\UserName のように、ドメイン名またはコンピュータ名を含めて指定しなければならない場合があります。特に、ActiveDirectoryドメインメンバのコンピュータとワークグループ設定のコンピュータが混在使用されているようなネットワーク環境や、複数のActive Directoryドメインが混在しているネットワークでは、明示的にドメイン名またはコンピュータ名を指定しないと、相手先コンピュータへの接続時に認証に失敗することがあります。

また、Get-Credentialは、単純に「資格情報の要求」ウインドウで入力したユーザー名とパスワードの情報を資格情報オブジェクトにするだけで、相手先コンピュータに認証を求めるわけではありません。したがって、ユーザー名やパスワードを間違えて入力しても、Get-Credetialは正常終了し、資格情報オブジェクトを作成します。実際にGet-WmiObject等でその資格情報オブジェクトを活用して接続するときに、初めて相手先コンピュータのユーザー認証を受けます。資格情報オブジェクトのユーザー名やパスワードを間違えていれば、そのときにエラーになります。

ユーザー名またはパスワードを間違えた資格情報オブジェクトでGet-WmiObjectを実行したときのエラー例。

ネットワーク共有設定

PowerShellで新規に共有を設定するためには、Win32_Shareクラスのオブジェクトを作成し、Createメソッドで作成します。ただし、Createメソッドは管理者権限がなければ実行できません。

例として変数名sとして共有のためのWmiClassオブジェクトを作成する場合、次のように実行します。

$s = [WMICLASS]"Win32_Share"

次に変数sのCreateメソッドで共有を設定します。Createメソッドの引数は以下の通りです。

Create(ローカルパス, 共有名, 共有の種類, 同時接続数の上限, 説明文)

共有の種類は、以下の数値を設定します。

意味
0 ディスク共有(共有フォルダ)
1 印刷キュー(共有プリンタ)
2 デバイス
3 IPC(管理共有)

同時接続数は、同時に共有資源に接続できる上限値を設定します。Null値($null)を設定したとき、無制限となります。

C:\Public\Database ディレクトリを、Data という共有名で、共有フォルダとし、同時接続数制限を設けない場合の設定例を次に紹介します。あらかじめWmiClassオブジェクトのsを作成しておいてください。また、Createメソッドを実行した結果を変数rに保存しています。

$s = [WMICLASS]"Win32_Share"
$s.Create("C:\Public\Database", "Data", 0, $null, "共有データベース")

共有フォルダの設定。

実行結果のReturnValueの値0が共有設定の正常終了を意味します。

ReturnValueの値の意味は、次の通りです。

意味
0 Success(正常終了)
2 Access Denied(アクセス不可)
8 Unknown Failure(未知のエラー)
9 Invalid Name(名前間違い)
10 Invalid Level(レベル間違い)
21 Invalid Parameter(パラメータ間違い)
22 Duplicate Share(既に同名の共有がある)
23 Redirected Path(リダイレクトされたパス)
24 Unknown Device or Directory(設定したパスの間違い)
25 Net Name Not Found(ネット名が不明)

※ スクリプトプログラム中で利用するときは、以下のように実行結果を一度変数に代入してから評価するといいでしょう。

$r = $s.Create("C:\Public\Database", "Data", 0, $null, "共有データベースフォルダ")

Get-WmiObjectで共有設定情報を取得してみます。

正しく共有フォルダ Data が設定されています。

次回は共有設定の変更、共有設定の削除について紹介します。