web-dev-qa-db-ja.com

PowerShellを使用してACLからユーザーを完全に削除する

PowerShellを使用してフォルダー権限からユーザーを削除したいのですが。ユーザー権限を削除する方法の例をたくさん見つけましたが、実際にはユーザーを完全に削除したいと思っています。

同等のことは、Windowsエクスプローラーで以下を実行することです。1.フォルダーを右クリックし、[プロパティ]を選択します。 2. [セキュリティ]タブをクリックします。3. [編集]をクリックします。4.ユーザーまたはグループを強調表示します。 5. [削除]をクリックします

PowerShellで模倣しようとしているのは、削除をクリックすることです。

前もって感謝します。

2
Simon Darlow

Simonが提案したように、次のコマンドは、特定のユーザーまたはグループを削除するために探しているものを実現します。

NTFSSecurityモジュールの使用( https://gallery.technet.Microsoft.com/scriptcenter/1abd77a5-9c0b-4a2b-acef-90dbb2b84e85

Remove-NTFSAccess -AccessRights FullControl -Account DOMAIN\Group -Path c:\temp -AccessType Deny -AppliesTo ThisFolderSubfoldersAndFiles
Remove-NTFSAccess -AccessRights FullControl -Account DOMAIN\Group -Path c:\temp -AccessType Allow -AppliesTo ThisFolderSubfoldersAndFiles

明示的に除外したグループ以外のすべてのセキュリティグループをフォルダーから削除する小さなスクリプトを作成しました。

$path = "C:\Path\To\Folder"
$users = @{}

$users = Get-NTFSAccess $path | Where-Object {$_.Account -ne "DOMAIN\Exclude"} | Select-Object Account

foreach ($user in $users) {
    $removalAccount = $user.Account
    Write-Host "Removing account - $($removalAccount)"
    Remove-NTFSAccess -Path $path -Account $removalAccount -AccessRights FullControl -AccessType Allow
    Remove-NTFSAccess -Path $path -Account $removalAccount -AccessRights FullControl -AccessType Deny    
}
4
Brandon

一般的に言えば、 Get-AclSet-Acl の組み合わせは、必要なことを達成できるはずです。ただし、Get-Aclには厄介な制限があり、権限が不十分なため(所有権も変更する権限がない場合)、Set-Aclを使用して変更されたACLを書き戻すことができないことが明らかになります。その問題の詳細は this SO question にあります。

いずれの場合でも、ファイルシステムのアクセス許可については、代わりにGet-Itemによって返されるオブジェクトからのメソッドを使用することにより、Get-Aclの制限を回避できます。

$acl = (Get-Item C:\myfolder).GetAccessControl('Access')

返されたオブジェクトの$acl.Accessプロパティを調べると、それが FileSystemAccessRule オブジェクト(別名ACEオブジェクト)のコレクションであることがわかります。最終的には、削除しようとしているユーザーに一致するACEのサブセットを見つけ、継承されたものはすべて無視する必要があります。継承されたACEを実際に削除することはできません。Windowsエクスプローラーでも、GUIを使用してそれらを削除しようとすると、多くのことが通知されます。いずれにせよ、ACEのサブセットを取得する方法は次のとおりです。

$acesToRemove = $acl.Access | ?{ $_.IsInherited -eq $false -and $_.IdentityReference -eq 'MYCOMPUTER\myuser' }

削除するACEを取得したので、元のACLからACEを削除して、フォルダーに書き戻すだけです。

$acl.RemoveAccessRuleAll($acesToRemove)
Set-Acl -AclObject $acl C:\myfolder\
1
Ryan Bolger