質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

1回答

1109閲覧

PowerShellによるフォルダのアクセス権編集方法について

tks_0312

総合スコア24

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

1クリップ

投稿2018/12/14 05:01

編集2018/12/14 05:08

PowerShellによるフォルダのアクセス権編集方法について質問があります。

ファイルサーバー直下に、「個人ドライブ」という共有フォルダを作成し、
各ユーザーのフォルダを保存しています。
(※各ユーザーのフォルダ名は、各ユーザーのユーザーIDと同一です。
123456というユーザーのフォルダは、\ファイルサーバー名\個人ドライブ\123456になります。)

そのユーザーのフォルダのフルコントロール権限を持っているのは、
そのフォルダと同じID名のユーザーのみで、他のユーザーは基本的にアクセス出来ません。
(例:\ファイルサーバー\個人ドライブ\123456 にアクセスできるのは、ユーザー:123456だけ)

そのフォルダのアクセス権については、
各ユーザーに編集をしてもらいたいと考えています。
具体的には、以下の手順です。

(1)フォルダ内に「access.csv」というファイルを作成する。※ファイルの中身は下記参照

ユーザー名 111222 333444 555666

(2)上記ファイルに記載されているユーザーに対して、読み取り専用のアクセス権を付与する。
(3)フォルダに、記載されていないユーザーがあった場合は、ACLを削除する

(2)までの手順まではなんとか作成できたのですが、
(3)の手順が分かりません。なにかヒントなどいただけますでしょうか。
(2)までの手順は、以下のコードになります。

#CSVを読み込んで、アクセス権を付与する。 #自身のユーザー名取得 $user_name_self = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name $user_name_self = $user_name_self.Substring(10, 6) #ドメイン名は邪魔なので削除し、社員番号のみを抽出 #CSVの読み込んで、配列(user_array)に保存。 $user_array = @() $file_name = '\access.csv' $folder_path = '\ファイルサーバー名\個人ドライブ\' + $user_name_self #個人ドライブフォルダ直下に社員番号(ユーザー名)のフォルダを作成する。 $file_path = $folder_path + $file_name $csv = Import-Csv -encoding Default -Path $file_path #配列にユーザー名を入れる foreach($line in $csv) { $user_array += $line.ユーザー名 } #読み取り権限を付与 $csv_len = $user_array.Length #CSVに入っていたユーザーの数を取得 $cnt = 0 while ( $cnt -lt $csv_len ) { $fc_user_name = 'ドメイン名\' + $user_array[$cnt] $acl = Get-Acl $folder_path $permission = ($fc_user_name,"ReadAndExecute","ContainerInherit, ObjectInherit", "None","Allow") # 引数:ユーザー名,アクセス権,下位フォルダへ継承,下位オブジェクトへ継承,継承の制限,アクセス許可 $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission $acl.SetAccessRule($accessRule) $acl | Set-Acl $folder_path $cnt++ }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

はじめまして。

未だ回答がついていませんが、解決したでしょうか。

(3)部分のみ処理する汚いコードを提示してみます。このままだと偉い人に怒られると思います。

PowerShell

1# 現在のACLを取得 2$ACL = Get-Acl $folder_path 3 4# 削除対象のアクセスルールを抽出し削除する 5## アクセスルール毎にループ 6## アクセスルールのユーザーが、ドメインのIDである 7## 同、フォルダーのオーナーではない(つまり自分ではない) 8## 同、アクセス可能ユーザーリストに含まれない 9## 条件を満たした(つまり不要な)ルールを削除 10$ACL.Access |? { 11 $_.IdentityReference -match "^$env:userdomain\" ` 12 -and $_.IdentityReference -ne $ACL.Owner ` 13 -and $user_array -notcontains ($_.IdentityReference.Value -split('\'))[1] 14} |% { 15 $ACL.Remove-AccessRule($_) 16} 17 18# ACLを反映 19Set-Acl $folder_path $ACL

追記:
後日、類似のことを試していたところ、この書き方だと削除できないものがあることを確認しました。
とはいいつつ、放置されているようでもあるので、記載コードの修正は行いませんので悪しからず。

投稿2019/01/09 08:50

編集2019/01/22 15:54
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tks_0312

2019/07/21 03:06

ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問