IT PowerShell Windows Windows Server 2008 R2 Windows Server 2016 Windows Server 2019

【PowerShell】Window Server 2008 R2での共有フォルダーの共有アクセス権の取得

投稿日:

今回も情報があまりなくて苦労しましたのでメモとして記事にしてみました。

Windows Server 2008 R2からWindows Server 2016に移行する際に既存の環境を調べる必要があったのでやってみました。

記事タイトルの通りでWindows Server 2008 R2上の共有フォルダーの共有アクセス権を取得するPowerShellです。

NTFSアクセス権の取得方法はたくさん情報あるのですが、共有アクセス権の取得に関して私が欲っする方法がなくて。。。

はじめに

以下環境を想定しています。

OS:Windows Server 2008 R2

Windows Server 2012 R2以降でしたらGet-SmbshareとGet-SmbShareAccessを使えば簡単にエクスポート/インポートできるようなのですが

Windows Server 2008 R2ではGet-SmbShareAccessが使えなかったので同じ状況の方はご紹介する方法を参考にしてみてください。

まだ完成形ではないですが一応最低限のことはできましたので。

ちなみにWindows Server 2012 以降でも同じように動くと思います。

 

PowerShell

PowerShellを管理者モードで起動して、以下ソースをコピペしてください。

管理者共有を除く共有フォルダーの以下4つの情報を出力しています。

[共有名]
[フォルダーパス]
[注釈]
[共有アクセス権]

$Securities = $null
$Securities = Get-WmiObject -Class Win32_LogicalShareSecuritySetting
foreach ($Security in $Securities) {
Write-Host "============================================="
$ShareName = $Security.Name
$s = Get-WmiObject -Class Win32_Share | where {$_.Name -like $Sharename}
Write-Host "[共有名]`n"$s.Name
Write-Host "`n[フォルダーパス]`n"$s.Path
Write-Host "`n[注釈]`n"$s.Description
Write-Host "`n[共有ACL]"
$Dacls = $Security.GetSecurityDescriptor().Descriptor.DACL
foreach ($Dacl in $Dacls) {
$Domain = $Dacl.Trustee.Domain
$Name = $Dacl.Trustee.Name
$AccessMask = $Dacl.AccessMask
switch ($AccessMask) {
2032127 {$Perm = "フルコントロール"}
1245631 {$Perm = "変更"}
1179817 {$Perm = "読み取り"}
}
If($Name -ne "Everyone"){
Write-Host $Domain"\"$Name ":" $Perm
}else{
Write-Host $Name ":" $Perm
}
}
Write-Host "`n"
}

結果は以下のような感じで出力されます。

 

ソースの一部に□を追加すると移行時のチェックリストになるのかと思って追加してみました。
使うかどうかわかりませんのでちょっとやってみただけです(笑)

$Securities = $null
$Securities = Get-WmiObject -Class Win32_LogicalShareSecuritySetting
foreach ($Security in $Securities) {
Write-Host "============================================="
$ShareName = $Security.Name
$s = Get-WmiObject -Class Win32_Share | where {$_.Name -like $Sharename}
Write-Host "[共有名]`n□"$s.Name
Write-Host "`n[フォルダーパス]`n□"$s.Path
Write-Host "`n[注釈]`n□"$s.Description
Write-Host "`n[共有ACL]"
$Dacls = $Security.GetSecurityDescriptor().Descriptor.DACL
foreach ($Dacl in $Dacls) {
$Domain = $Dacl.Trustee.Domain
$Name = $Dacl.Trustee.Name
$AccessMask = $Dacl.AccessMask
switch ($AccessMask) {
2032127 {$Perm = "フルコントロール"}
1245631 {$Perm = "変更"}
1179817 {$Perm = "読み取り"}
}
If($Name -ne "Everyone"){
Write-Host "□"$Domain"\"$Name ":" $Perm
}else{
Write-Host "□"$Name ":" $Perm
}
}
Write-Host "`n"
}

この場合の出力はこんな感じです

 

おわりに

NTFSアクセス権も欲しいのでNTFSアクセス権も一緒に取得するバージョンができたらまたご紹介いたします。

プログラムは初心者なのでたったこれだけでもかなり時間を使ってしまいました。

その時間で目視した方が早いんじゃないかというくらいなんですが、勉強&同じ仕事が来た場合に楽になるかなっと思いもうちょっと頑張ります。

-IT, PowerShell, Windows, Windows Server 2008 R2, Windows Server 2016, Windows Server 2019
-, , ,

Copyright© Live Free , 2020 All Rights Reserved.