Windows Server 2012 マシン上に、すべてのユーザー プロファイル ファイル (マイ ドキュメント、デスクトップなど) を保存するために使用するネットワーク共有があります。
削除する必要のある古いユーザーが何百人もいるので、私はそれらをすべて 1 人ずつ確認しています... 最初に、管理者を 1 人のユーザーのすべてのファイルの所有者にします... 次に、そのユーザーのすべてのファイルに対する完全な制御を管理者に与えます... 次に、そのユーザーのファイルを削除し... 次に、次のユーザーに進みます。
これには数日かかります。
この同じディレクトリ内には、所有者になりたくない、または削除したくない有効な/現在のユーザー ファイルも多数あります。
このネットワーク共有内の特定のフォルダーを削除するのに、時間のかからない方法はありますか?
すべての古いユーザーに入力して、数時間そのまま放置できるスクリプトのようなものはありますか?
答え1
もちろん、PowerShell を使えばすべてが可能です! :-) これは、これを実行するための全体的なプロセスです。
まず、コマンドを使用して、CSV ファイルから削除する上位のフォルダー/ユーザーを読み取りますImport-CSV $Filename | ForEach-Object
。
各トップ フォルダーに対して、ForEach ブロックで、 を使用してすべてのサブフォルダーとファイルを読み取ることができますGet-ChildItem -Recurse
。
次に、削除してはならないファイルまたはフォルダーを含む 2 番目の CSV ファイルを作成し、ループする各ファイルについて、このファイルを読み取って比較し、(所有権を取得した後で) 保存するか削除するかを判断できます。
答え2
もう一度やり直す必要があったので、今日これを再検討しました。@PatrikN からの提案に従って、使用した PowerShell スクリプトは次のとおりです。
Get-ChildItem C:\UserDocs |
ForEach-Object {
if (!(Get-ADUser -Filter "sAMAccountName -eq '$($_.Name)'")) {
"$($_.Name) does not exist and is being deleted."
takeown /a /r /d Y /f $_.FullName
$Acl = Get-Acl $_.FullName
$Acl.AddAccessRule(
(New-Object System.Security.AccessControl.FileSystemAccessRule(
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name,
"FullControl",
"ContainerInherit, ObjectInherit",
"None",
"Allow"
))
)
(Get-Item $_.FullName).SetAccessControl($Acl)
Remove-Item -LiteralPath $_.FullName -Force -Recurse
}
}
結局、CSV ファイルは使用しませんでした。
このスクリプトは、すべてのユーザー プロファイル ディレクトリをループし、名前がアクティブ ディレクトリ内にあるかどうかを照会し、ない場合は所有権を取得し、完全な権限を設定してから削除します。うまく機能しました。