![ファイル サーバーから多数の古いユーザー プロファイルを削除するスクリプトはありますか?](https://rvso.com/image/717740/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%20%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%8B%E3%82%89%E5%A4%9A%E6%95%B0%E3%81%AE%E5%8F%A4%E3%81%84%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%20%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B%3F.png)
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 ファイルは使用しませんでした。
このスクリプトは、すべてのユーザー プロファイル ディレクトリをループし、名前がアクティブ ディレクトリ内にあるかどうかを照会し、ない場合は所有権を取得し、完全な権限を設定してから削除します。うまく機能しました。