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

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

ただいまの
回答率

90.45%

  • PowerShell

    495questions

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

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 679

tks_0312

score 11

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++
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

はじめまして。

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

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

# 現在のACLを取得
$ACL = Get-Acl $folder_path

# 削除対象のアクセスルールを抽出し削除する
## アクセスルール毎にループ
##   アクセスルールのユーザーが、ドメインのIDである
##   同、フォルダーのオーナーではない(つまり自分ではない)
##   同、アクセス可能ユーザーリストに含まれない
## 条件を満たした(つまり不要な)ルールを削除
$ACL.Access |? {
  $_.IdentityReference -match "^$env:userdomain\\" `
  -and $_.IdentityReference -ne $ACL.Owner `
  -and $user_array -notcontains ($_.IdentityReference.Value -split('\\'))[1]
} |% {
  $ACL.Remove-AccessRule($_)
}

# ACLを反映
Set-Acl $folder_path $ACL

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる