PowerShellを使ってフォルダーを共有したり、共有アクセス許可を設定する方法
本エントリーの目次
PowerShellを使ってフォルダーを共有したり、共有アクセス許可(共有アクセス権)を設定したい!
このブログでは以前に、コマンドプロンプトを使ったコマンド操作により、フォルダーを共有したり共有アクセス許可(共有アクセス権)を設定する方法をご紹介しています。
参考:Windows コマンドでアカウントや共有を設定する方法
しかしコマンドプロンプトのコマンド操作ではなく、PowerShellのコマンドレットを使った操作により設定したいケースもあるでしょう。
そこで今回は、PowerShellを使ってフォルダーを共有したり、共有アクセス許可(共有アクセス権)を設定する方法をご紹介します!
尚、フォルダーを共有する際は、事前にアクセス権の設定に使用するユーザーアカウントやグループを用意しておく必要があります。
PowerShellを使って、ローカルユーザー(アカウント)やローカルグループの追加・変更・削除を行う方法については、以下ページでご紹介しているので、併せて参考になさってください。
PowerShellでローカルユーザー(アカウント)やグループの追加・変更・削除を行う方法
PowerShellを使ってフォルダーを共有する際は、管理者権限で起動したPowerShellを使用する!
これからご紹介するPowerShellを使ったフォルダーの共有設定の方法は、通常のPowerShellで実行すると『アクセスが拒否されました。』という実行時エラーが発生し、処理が失敗してしまいます。
そのため、管理者権限で起動したPowerShellを使ってコマンド操作を実行してください。
参考:Windows アプリケーションを管理者権限で起動・実行する方法
PowerShellを使ってフォルダーを共有する設定方法
PowerShellを使ってフォルダーを共有する場合は、『New-SmbShare』コマンドレットを使用します。
たとえばCドライブの直下にある『test』フォルダー(C:\test)を、『shared』という共有名(共有フォルダーの名前)で共有する(共有フォルダーに設定する)場合は、『New-SmbShare -Name shared -Path “C:\test”』というコマンドを実行します。
1 2 3 4 5 6 7 8 | PS C:\> New-SmbShare -Name shared -Path "C:\test" Name ScopeName Path Description ---- --------- ---- ----------- shared * C:\test PS C:\> |
尚、『New-SmbShare』コマンドレットを実行した際、『-Path』パラメーターに指定したフォルダーは自動で作成されません。
したがって以下のようなコマンドレットを事前に実行し、あらかじめ共有設定を行うフォルダーを作成しておく必要があります。
1 | New-Item -Path "C:\test" -ItemType Directory |
またフォルダーを共有する際、『コメント』も併せて指定可能です。
コメントを設定したい場合は、『-Description』パラメーターを使用し、以下形式のコマンドを実行してください。
1 | New-SmbShare -Name shared -Path "C:\test" -Description "情報共有用の共有フォルダー" |
共有アクセス許可(共有アクセス権)を指定して、フォルダーを共有する設定方法
先ほど例示したコマンド文字列のように、『New-SmbShare』コマンドレットを使用して共有フォルダーを作成する際、共有アクセス許可(共有アクセス権)を指定しなかった場合には、以下のように規定の共有アクセス許可(Everyone:読み取り許可)が指定されたものとして、フォルダーが共有されます。
規定の共有アクセス許可とは異なる設定の共有アクセス許可を指定して、フォルダーを共有したいときは、以下パラメーターを併せて指定します。
- 読み取り:『-ReadAccess』パラメーター
- 変更:『-ChangeAccess』パラメーター
- フルコントロール:『-FullAccess』パラメーター
複数のアカウント、またはグループを指定するときは、それぞれを半角のカンマで区切って指定してください。
以下に例示したコマンドを参考にすると良いでしょう。
共有設定を行う際、共有アクセス許可の『読み取り』許可設定を行うコマンド例:
1 2 3 4 5 6 7 8 9 10 11 | #『test-read1』アカウントに対して共有アクセス許可の『読み取り』許可設定を行った共有フォルダーを設定 New-SmbShare -Name shared -Path "C:\test" -ReadAccess test-read1 #『test-read1』アカウントと『test-read2』アカウントに対して共有アクセス許可の『読み取り』許可設定を行った共有フォルダーを設定 New-SmbShare -Name shared -Path "C:\test" -ReadAccess test-read1,test-read2 #または $users = @("test-read1","test-read2") New-SmbShare -Name shared -Path "C:\test" -ReadAccess $users #『test-group』グループに対して共有アクセス許可の『読み取り』許可設定を行った共有フォルダーを設定 New-SmbShare -Name shared -Path "C:\test" -ReadAccess test-group |
共有設定を行う際、共有アクセス許可の『変更』許可設定を行うコマンド例:
1 2 | #『test-change』アカウントに対して共有アクセス許可の『変更』許可設定を行った共有フォルダーを設定 New-SmbShare -Name shared -Path "C:\test" -ChangeAccess test-change |
共有設定を行う際、共有アクセス許可の『フルコントロール』許可設定を行うコマンド例:
1 2 | #『test-full』アカウントに対して共有アクセス許可の『フルコントロール』許可設定を行った共有フォルダーを設定 New-SmbShare -Name shared -Path "C:\test" -FullAccess test-full |
共有アクセス許可の『読み取り・変更・フルコントロール』許可を、まとめて設定するコマンド例:
1 2 3 4 | #『test-read1』アカウントと『test-read2』アカウントに対して共有アクセス許可の『読み取り』許可、 #『test-change』アカウントに対して共有アクセス許可の『変更』許可、 #『test-full』アカウントに対して共有アクセス許可の『フルコントロール』許可設定を行った共有フォルダーを設定する方法 New-SmbShare -Name shared -Path "C:\test" -ReadAccess test-read1,test-read2 -ChangeAccess test-change -FullAccess test-full |
PowerShellを使って共有フォルダーに関する情報を取得する方法
すでに作成済みの共有フォルダーに関する情報をPowerShellを使って取得するときは、『Get-SmbShare』コマンドレットを使用します。
『shared』という共有名の共有フォルダーに関する情報を取得するケースでは、以下コマンドを実行してください。
1 | Get-SmbShare -Name shared |
ただしこの形式のコマンドでは、共有フォルダーに関する一部の情報しか取得できません。
詳細な情報を取得したいときは、『Format-List』コマンドレットを併用し、『Get-SmbShare -Name <共有名> | Format-List -Property *』という形式のコマンドを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 | PS C:\> Get-SmbShare -Name shared | Format-List -Property * PresetPathAcl : System.Security.AccessControl.DirectorySecurity ShareState : Online AvailabilityType : NonClustered ShareType : FileSystemDirectory FolderEnumerationMode : Unrestricted CachingMode : Manual 中略 PS C:\> |
また『-Name』パラメーターで共有名を指定せずに、『Get-SmbShare』コマンドレットを実行すると、コンピューターのすべての共有フォルダーに関する情報が取得されます。
1 2 3 4 5 6 7 8 9 10 11 | PS C:\> Get-SmbShare Name ScopeName Path Description ---- --------- ---- ----------- ADMIN$ * C:\WINDOWS Remote Admin C$ * C:\ Default share IPC$ * Remote IPC shared * C:\test PS C:\> |
こちらも詳細な情報を取得したいときは『Format-List』コマンドレットを併用し、以下コマンドを実行してください。
1 | Get-SmbShare | Format-List -Property * |
『Get-SmbShare』コマンドレットを実行して、コンピューターのすべての共有フォルダーに関する情報を取得すると、『ADMIN$』や『C$』といった特殊な共有(管理共有)もリストアップの対象となります。
これら管理共有をリストアップの対象から除外したいときは、『-Special』パラメーターに『$false』を指定してください。
1 2 3 4 5 6 7 8 | PS C:\> Get-SmbShare -Special $false Name ScopeName Path Description ---- --------- ---- ----------- shared * C:\test PS C:\> |
PowerShellを使って共有フォルダーの設定を変更する方法
『Set-SmbShare』コマンドレットを使用することで、『コメント』や『キャッシュ』、『同時に共有できるユーザー数』などの共有フォルダーの設定を変更できます。
共有フォルダーの『コメント』を『情報共有用の共有フォルダーです!』に変更したいときは、以下コマンドを実行してください。
1 | Set-SmbShare -Name shared -Description "情報共有用の共有フォルダーです!" |
『Set-SmbShare』コマンドレットを使った共有フォルダーの設定変更をする際は、対話的な実行確認(本当に処理を実行するかどうかの確認)が行われます。
これを表示せず、ただちに変更処理を実行させたいときは、以下のように併せて『-Force』パラメーターを指定してください。
1 | Set-SmbShare -Name shared -Description "情報共有用の共有フォルダーです!" -Force |
PowerShellを使って共有フォルダーの共有アクセス許可(共有アクセス権)を確認・変更する方法
PowerShellを使って共有フォルダーの共有アクセス許可を変更する際は、まずは現在設定されている共有アクセス許可を確認し、変更内容を検討。
その後、変更用のコマンドレットを実行して、設定を変更すると良いでしょう。
共有フォルダーの共有アクセス許可を確認する方法
現在、共有フォルダーに設定されている共有アクセス許可の設定状態を確認する場合は、『Get-SmbShareAccess -Name <共有名>』という形式のコマンドを実行します。
1 2 3 4 5 6 7 8 9 10 11 | PS C:\> Get-SmbShareAccess -Name shared Name ScopeName AccountName AccessControlType AccessRight ---- --------- ----------- ----------------- ----------- shared * WIN10TESTPC\test-full Allow Full shared * WIN10TESTPC\test-change Allow Change shared * WIN10TESTPC\test-read1 Allow Read shared * WIN10TESTPC\test-read2 Allow Read PS C:\> |
上記実行結果の例では、以下設定(アクセス許可エントリ)が適用されていることが分かります。
- 共有名『shared』の共有フォルダーに対し、『test-full』アカウントの『フルコントロール』を『許可』
- 共有名『shared』の共有フォルダーに対し、『test-change』アカウントの『変更』を『許可』
- 共有名『shared』の共有フォルダーに対し、『test-read1』アカウントの『読み取り』を『許可』
- 共有名『shared』の共有フォルダーに対し、『test-read2』アカウントの『読み取り』を『許可』
尚、『Get-SmbShareAccess -Name <共有名>』形式のコマンドでは、一度に一つの共有に関するアクセス許可エントリしか取得できません。
コンピューターのすべての共有フォルダーに関するアクセス許可エントリを取得したいときは、以下コマンドを実行すると良いでしょう。
1 2 3 4 | Get-SmbShare | ForEach-Object -Process {Get-SmbShareAccess -Name $_.Name} #管理共有以外の共有フォルダーのアクセス許可エントリを取得・表示する Get-SmbShare -Special $false | ForEach-Object -Process {Get-SmbShareAccess -Name $_.Name} |
また(AccessRightに)『読み取り』が設定されているアクセス許可エントリのみを取得したいときは、以下コマンドを実行してください。
1 | Get-SmbShareAccess -Name shared | Where-Object {$_.AccessRight -eq "Read"} |
共有フォルダーの共有アクセス許可を変更する方法
共有フォルダーの共有アクセス許可(共有アクセス権)を変更する際は、以下4つのコマンドレットを使用します。
- 『Grant-SmbShareAccess』コマンドレット
- 『Revoke-SmbShareAccess』コマンドレット
- 『Block-SmbShareAccess』コマンドレット
- 『Unblock-SmbShareAccess』コマンドレット
これらのコマンドレットでは、共有フォルダーのアクセス許可エントリを追加。
または削除することで、共有アクセス許可(共有アクセス権)を変更します。
以下実行例を参考に、共有フォルダーのアクセス許可エントリを設定すると良いでしょう。
アクセス許可エントリを追加し、共有アクセス許可の『読み取り』許可設定を行うコマンド例:
1 2 3 4 5 6 7 8 9 10 11 | #『test-read1』アカウントに対して共有アクセス許可の『読み取り』許可設定のアクセス許可エントリを追加する Grant-SmbShareAccess -Name shared -AccountName test-read1 -AccessRight Read #対話的な実行確認を表示せず、ただちに『test-read1』アカウントに対して共有アクセス許可の『読み取り』許可設定のアクセス許可エントリを追加する Grant-SmbShareAccess -Name shared -AccountName test-read1 -AccessRight Read -Force #『test-read1』アカウントと『test-read2』アカウントに対して共有アクセス許可の『読み取り』許可設定のアクセス許可エントリを追加する Grant-SmbShareAccess -Name shared -AccountName test-read1,test-read2 -AccessRight Read #または $users = @("test-read1","test-read2") Grant-SmbShareAccess -Name shared -AccountName $users -AccessRight Read |
アクセス許可エントリを追加し、共有アクセス許可の『変更』許可設定を行うコマンド例:
1 2 | #対話的な実行確認を表示せず、ただちに『test-change』アカウントに対して共有アクセス許可の『変更』許可設定のアクセス許可エントリを追加する Grant-SmbShareAccess -Name shared -AccountName test-change -AccessRight Change -Force |
アクセス許可エントリを追加し、共有アクセス許可の『フルコントロール』許可設定を行うコマンド例:
1 2 | #対話的な実行確認を表示せず、ただちに『test-full』アカウントに対して共有アクセス許可の『フルコントロール』許可設定のアクセス許可エントリを追加する Grant-SmbShareAccess -Name shared -AccountName test-full -AccessRight Full -Force |
共有アクセス許可のアクセス許可エントリを削除するコマンド例:
1 2 3 4 5 | #『test-read1』アカウントに設定されているアクセス許可エントリを削除する Revoke-SmbShareAccess -Name shared -AccountName test-read1 #対話的な実行確認を表示せず、ただちに『test-change』アカウントに設定されているアクセス許可エントリを削除する Revoke-SmbShareAccess -Name shared -AccountName test-change -Force |
共有アクセス許可の”拒否”のアクセス許可エントリの追加・削除を行うコマンド例:
1 2 3 4 5 | #『test-block』アカウントに対して共有アクセス許可の『フルコントロール』拒否設定のアクセス許可エントリを追加する Block-SmbShareAccess -Name shared -AccountName test-block #『test-block』アカウントに設定されている共有アクセス許可の拒否設定のアクセス許可エントリを削除する Unblock-SmbShareAccess -Name shared -AccountName test-block |
尚、共有フォルダーのアクセス可否は、以下2つのアクセス許可の設定が評価され、決定するものです。
- 共有アクセス許可(共有アクセス権)
- NTFSアクセス許可(NTFSアクセス権)
参考:ファイル共有はNTFSアクセス権と共有アクセス権のどちらで設定?
したがって、共有アクセス許可の設定をアクセス許可に設定していても、NTFSアクセス許可の設定状況によっては、共有フォルダーにアクセスできないケースがあります。
この場合には、NTFSアクセス許可の設定も許可設定としてあげることで、アクセスができるようになるはずです。
PowerShellを使って共有フォルダーを削除(フォルダーの共有を解除)する方法
すでに共有設定が行われている共有フォルダーを削除(フォルダーの共有を解除)したいときは、『Remove-SmbShare -Name <共有名>』という構文で、コマンドを実行してください。
共有名が『shared』の共有フォルダーの共有を解除したいときは、以下コマンドを実行します。
1 2 3 4 | Remove-SmbShare -Name shared #対話的な実行確認を表示せず、ただちに共有名が『shared』の共有フォルダーの共有を解除する Remove-SmbShare -Name shared -Force |
『Remove-SmbShare』コマンドレットの実行時に行われるのは、共有の解除だけです。
共有していたフォルダー自体や、そのフォルダー内に保存されていた実態のデータが削除されるわけではありません。
そのため、データが不要となった場合には、フォルダーの実態データはエクスプローラーの操作などにより、別途削除する必要があります。
以上、参考になさってくださーい!