Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

PowerShellでNTFSアクセス許可を管理する方法|Get-Acl・Set-AclとNTFSSecurityモジュール活用ガイド

Windowsでファイルやフォルダーへのアクセスを管理するには、NTFSファイルシステム上のオブジェクト(ファイルやフォルダー)に対して、特別なACL(Access Control List:アクセス制御リスト)が割り当てられます。オブジェクトのACLには、ユーザーやグループがそのファイルシステムオブジェクトに対して実行できる操作(アクセス許可)が定義されています。

多くの場合、Windows管理者はエクスプローラーのGUI(ファイルやフォルダーのプロパティ→「セキュリティ」タブ)や、icaclsコンソールツールを使ってNTFSアクセス許可を管理しています。しかし、この記事で解説するPowerShellコマンドレットを使えば、スクリプトへの組み込みや、Windowsファイルサーバー・ワークステーションにおけるNTFSアクセス許可管理の自動化が可能になります。

Get-AclとSet-Acl:NTFS ACLを管理する組み込みコマンドレット

PowerShell v5(Windows 10/Windows Server 2016)には、ACLを管理するための組み込みコマンドレットが2つ用意されています(Microsoft.PowerShell.Securityモジュールの一部です)。

  • Get-Acl — NTFSファイルシステム上の特定オブジェクトの現在のACLを取得します
  • Set-Acl — オブジェクトの既存のACLを追加・変更します

ただし、実際の業務でNTFSアクセス許可を管理するには、これらの組み込みコマンドレットの機能だけでは不十分なケースが多いため、詳細な説明は省略し、典型的な使用例を中心に見ていきましょう。

フォルダー(ファイル)の現在の所有者と、割り当てられているNTFSアクセス許可の一覧を取得するには、次のコマンドを実行します。

get-acl C:\docs\ |fl

出力結果には、現在のアクセス許可がSDDL形式の文字列としても表示されます。このアクセス記述形式については、「Windowsサービスのアクセス許可を設定する方法」の記事でも簡単に紹介しています。

NTFSアクセス許可の一覧を、より見やすい形式だけで表示することも可能です。

(get-acl C:\docs\).access

また、あるNTFSフォルダー(オブジェクト)から別のフォルダーへ、現在のNTFSアクセス許可をコピーして適用することもできます。

Get-Acl e:\old_docs | Set-Acl C:\docs

この操作を行うには、実行アカウントがオブジェクトの所有者であり、「所有権の取得(Take Ownership)」権限を持っている必要があります。

Set-Aclの注意点と基本的なスクリプト例

Set-ACLを使用する際の最大の問題点は、NTFSアクセス許可だけを変更したい場合でも、コマンドレットが常にリソースの所有者を変更しようとすることです。そのため、オブジェクトにアクセス許可を追加するには、次のようなやや複雑なスクリプトが必要になります。

$path = "c:\docs"
$user = "corp\DSullivan"
$Permiss = "Read, ReadAndExecute, ListDirectory"
$InheritSettings = "Containerinherit, ObjectInherit"
$PropogationSettings = "None"
$RuleType = "Allow"
$acl = Get-Acl $path
$perm = $user, $Permiss, $InheritSettings, $PropogationSettings, $RuleType
$rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $perm
$acl.SetAccessRule($rule)
$acl | Set-Acl -Path $path

ユーザーやグループに付与されたフォルダーへのNTFSアクセス許可を削除する場合は、次のようにします。

$path = "c:\docs"
$acl = Get-Acl $path
$rules = $acl.Access | where IsInherited -eq $false
$targetrule = $rules | where IdentityReference -eq "corp\DSullivan"
$acl.RemoveAccessRule($targetrule)
$acl | Set-Acl -Path $path

PowerShellからフォルダーのアクセス許可の継承を無効化するには、以下のコマンドを使用します。

$path = 'C:\docs'
$acl = Get-ACL -Path $path
$acl.SetAccessRuleProtection($True, $True) # 1つ目の$Trueはフォルダーを保護するかどうか、2つ目の$Trueは現在のNTFSアクセス許可をコピーするかどうかを指定
Set-Acl -Path $path -AclObject $acl

さらに、Get-AclとSet-Aclを組み合わせれば、オブジェクトのNTFS監査設定(共有フォルダーからファイルを削除したユーザーを特定する方法の記事を参照)や、Active DirectoryにおけるOUの委任アクセス許可の管理にも応用できます。

NTFSSecurity PowerShellモジュールによるファイルアクセス許可の管理

前述のとおり、ファイルシステムオブジェクトを扱う組み込みコマンドレットは必ずしも使い勝手が良いとは言えません。WindowsでファイルやフォルダーのNTFSアクセス許可を管理するなら、PowerShellギャラリーで公開されている専用モジュールNTFSSecurityを使用するのがおすすめです。

最新バージョンのNTFSSecurityモジュール(執筆時点で4.2.6)は、次のコマンドでインストールできます。

Install-Module -Name NTFSSecurity

手動でダウンロードする場合は、モジュールのアーカイブをC:\Windows\System32\WindowsPowerShell\v1.0\Modules\NTFSSecurityに展開してください(ダウンロードしたファイルのブロック解除を忘れないようにしましょう)。

NTFSSecurityモジュールをPowerShellセッションにインポートします。

Import-Module NTFSSecurity

モジュールに含まれるコマンドの一覧(36個のコマンドレット)を表示してみましょう。

Get-Command -Module NTFSSecurity

フォルダーの現在のNTFSアクセス許可を一覧表示するには、次のコマンドを実行します。

Get-Item 'c:\docs' | Get-NTFSAccess

ご覧のとおり、組み込みコマンドレットよりも格段に見やすい形式でアクセス許可が表示されます。

特定のフォルダーに対して、ユーザーやグループにフルコントロール権限を付与するには、次のコマンドを使用します。

Add-NTFSAccess -Path C:\docs -Account 'CORP\RShelby','BUILTIN\Administrators' -AccessRights 'Fullcontrol' -PassThru

ヒント: デフォルトでは、NTFSSecurityのコマンドレットは何もデータを返しません。-PassThruパラメーターを付けると、コマンド実行後に新しいACLが表示されるようになります。

最上位フォルダーレベルのみにアクセス許可を付与し、配下のオブジェクトには変更を適用したくない場合(フォルダーのみ対象)は、次のコマンドを使います。

Add-NTFSAccess c:\docs\public -Account corp\LMurkowski -AccessRights Modify -AppliesTo ThisFolderOnly

割り当て済みのNTFSアクセス許可を削除するには、以下を実行します。

Remove-NTFSAccess -Path C:\DOCS -Account 'corp\LMurkowski' -AccessRights FullControl -PassThru

次のコマンドは、指定したアカウントについて、フォルダー内のすべての子オブジェクトからアクセス許可を削除します(継承されたアクセス許可はスキップされます)。

Get-ChildItem -Path C:\docs -Recurse | Get-NTFSAccess -Account 'corp\LMurkowski' -ExcludeInherited | Remove-NTFSAccess -PassThru

また、次のコマンドを使えば、Administratorアカウントをフォルダー内のすべての子オブジェクトの所有者に設定できます。

Get-ChildItem -Path C:\docs -Recurse -Force | Set-NTFSOwner -Account 'Administrator'

フォルダーオブジェクトに手動で割り当てられたすべてのアクセス許可をクリアするには(継承されたアクセス許可は削除されません)、次のようにします。

Get-ChildItem -Path C:\docs -Recurse -Force | Clear-NTFSAccess

フォルダー内のすべてのオブジェクトでNTFS継承を有効化するには、以下のコマンドを実行します。

Get-ChildItem -Path C:\docs -Recurse -Force | Enable-NTFSAccessInheritance

継承されたものを除き、手動で割り当てられたすべてのアクセス許可を表示するには、次のようにします。

dir C:\docs | Get-NTFSAccess –ExcludeInherited

特定のアカウントに割り当てられたアクセス許可を表示することもできます(これは有効なアクセス許可とは異なるため、混同しないよう注意してください。有効なアクセス許可については後述します)。

dir C:\docs | Get-NTFSAccess -Account woshub\RShelby

PowerShellでNTFSの有効なアクセス許可を確認する方法

有効なNTFSアクセス許可(Effective Access)は、Get-EffectiveAccess系のコマンドレットで確認できます。たとえば、複数のADセキュリティグループに特定フォルダーへのアクセスを許可している環境で、「特定のユーザーアカウント(またはSID)がそのフォルダーのファイルにアクセスできるのか?」を知りたい場面はよくあります。ユーザーが所属するADグループの全メンバーを一覧調査しなくても、有効なアクセス許可を確認すれば一目瞭然です。

たとえば、ドメインアカウントconfroomについて、フォルダー内のすべての子ディレクトリの有効なアクセス許可を確認するには、次のコマンドを実行します。

Get-ChildItem -Path c:\docs -Recurse -Directory | Get-NTFSEffectiveAccess -Account 'corp\confroom' | select Account, AccessControlType, AccessRights, FullName

特定のファイルに対する有効なアクセス許可を確認することも可能です。

Get-Item -Path 'C:\docs\annual_report2019.xlsx' | Get-NTFSEffectiveAccess -Account 'corp\confroom' | Format-List

ファイルシステムオブジェクトに対するユーザーの現在有効なアクセス許可は、出力結果のAccessRightsフィールドに表示されます。

  1. Microsoft OneDriveでファイルを管理・同期・共有する方法【初心者向けガイド】

    Googleが「Google Drive」を、Appleが「iCloud」を提供しているように、Microsoftも「OneDrive(旧称:SkyDrive)」というクラウドストレージサービスを展開しています。近年、個人ユーザーや企業の間では、高価なハードウェアへの依存を減らし、ファイルやドキュメントをクラウド上で管理するスタイルが主流になりつつあります。 クラウドサービスへの需要が高まる中、OneDriveも機能拡張を続けています。最新版では、ドラッグ&ドロップによるファイルや写真の簡単な転送、リアルタイムでの共同編集(共同オーサリング)、ファイルのプレビュー機能、より多くのファイル形式へ

  2. Windowsのタグ機能でファイルとフォルダを効率よく管理する方法

    古いファイルを探すのは、まるで石炭庫の中で黒猫を探すようなもの。「去年の南米旅行の写真、どこに保存したっけ?」「2018年に書いたあのレポート、ファイル名は何だったかな?」——そんな経験はありませんか。 Windows 10には強力な検索機能が標準搭載されており、Cortanaを活用すれば画像、音楽、PDFなどのフィルターを使ってスマートに検索できます。しかし、意外と見過ごされがちな機能の一つがWindowsタグです。この機能を使えば、ファイルをより効率的に検索・整理できるようになります。 Windowsタグとは?使うべき理由 タグは、Windows 10において最も過小評価されている機能の