CIAO
Potete dare un'occhiata a questo script che, se eseguito da una penna USB e dal Prompt dei comandi dell'amministratore di una qualsiasi edizione di Windows 7 con il comando powershell -ExecutionPolicy Unrestricted -file <unita`_penna_USB>:\RimRifRimAccountDefault.ps1 -RemovedSID '<SID_Account_eliminato>', dovrebbe eliminare tutti gli rifferimenti rimasti di un account di Windows 7 eliminato correttamente da questo S/O:
codice:
# Parametri da inserire in una riga di comando:
# $RemovedSID Variabile che contiene un SID di un account rimosso di Windows 7 da rimuovere dal sistema.
# $RemovedAccountNameDeleted Variabile che contiene il nome di un account rimosso di Windows 7 da rimuovere dal sistema.
# Variabili definite dall'utente:
# $Drives Variabile che contiene le lettere delle partizioni logiche di un hard-disk e gli hive del registro.
# $ObjectACL Variabile che coontiene le ACL dell'oggetto analizzato.
# $BadRules Variabile che permette di decidere se, fra gli ACL di un oggetto, e` contenuto il SID dell'account rimosso.
# $StartKey Variabile che contiene le chiavi del registro da analizzare.
# $ShouldRemove Variabile che permette di decidere se rimuovere o meno una chiave del registro a secondo del suo valore.
param ($RemovedSID)
param ($RemovedAccountNameDeleted)
# Funzione che analizza alcune chiavi numeriche del registro relative al servizio Windows Search ed elimina le chiavi superflue che hanno il valore delle
# loro voci "URL" o "Path" pari ad una directory che include ancora il SID orfano dell'account rimosso o il nome di questo account.
function WindowsSearchKeysDeleted ($StartKey)
{
Get-ChildItem $StartKey -Recurse |
ForEach-Object {
# Verifica URL
$ShouldRemove = @(Get-ItemProperty $_ URL | Where-Object { $_.URL -eq $RemovedSID or $RemovedAccountNameDeleted}).Count -gt 0)
# Verifica Path
$ShouldRemove = $ShouldRemove -or (@(Get-ItemProperty $_ Path | Where-Object { $_.Path -eq $RemovedSID or $RemovedAccountNameDeleted}).Count
-gt 0)
# Rimozione chiave corrente e sottochiavi
if ($shouldRemove) {
$_ | Remove-Item -Recurse -WhatIf
}
}
}
# Funzione che rimuove le chiavi o le voci del registro contenenti ancora il SID orfano dell'account rimosso.
fuction KeyAndItemDeleted ($StartKey)
{
if ($StartKey -eq 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\NetCache\PurgeAtNextLogoff') {
set-Location '$StartKey'
Remove-ItemProperty '$RemovedSID' -WhatIf
}
else {
Set-Location '$StartKey'
Remove-Item '$RemovedSID' -WhatIf
}
}
# Esamina le partizioni di un hard-disk e gli hive del registro per rimuovere il SID orfano dell'account rimosso dai ACL delle directory/file e delle
# chiavi del registro.
New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT
New-PSDrive -Name HKU -PSProvider Registry -Root HKEY_USERS
New-PSDrive -Name HKCC -PSProvider Registry -Root HKEY_CURRENT_CONFIG
$Drives = [Environment]::GetLogicalDrives(), 'HKLM:\', 'HKCR:\', 'HKU:\', 'HKCC:\'
$Drives | Get-ChildItem -Recurse -Force |
ForEach-Object {
"Verifica di {0}..." -f $_
# Recupera le ACL dell'oggetto
$ObjectACL = $_.GetAccessControl()
# Recupera le regole per il SID desiderato
$BadRules = @(
$ObjectACL.GetAccessRules($true, $false, [Security.Principal.SecurityIdentifier]) |
? { $_.IdentityReference -eq $RemovedSID }
)
if ($BadRules.Count -gt 0) {
"Rimozione regole orfane (elementi trovati: {0})..." -f $BadRules.Count
# Rimuove le regole orfane
$BadRules |
ForEach-Object {
$ObjectACL.RemoveAccessRule($_)
}
# Aggiorna le ACL dell'oggetto
$_.SetAccessControl($ObjectACL)
}
}
# Rimuove le eventuali chiavi numeriche del registro relative a Windows Search che hanno il valore delle loro voci "URL" o "Path" pari ad una directory che
# include ancora il SID orfano dell'account rimosso o il nome di questo account.
WindowsSearchKeysDeleted -StartKey 'HKLM:\SOFTWARE\Microsoft\Windows Search\CrawlScopeManager\Windows\SystemIndex\DefaultRules'
WindowsSearchKeysDeleted -StartKey 'HKLM:\SOFTWARE\Microsoft\Windows Search\CrawlScopeManager\Windows\SystemIndex\WorkingSetRules'
if (Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows Search\CrawlScopeManager_Previous_Version\Windows\SystemIndex\DefaultRules' -eq "true") {
WindowsSearchKeysDeleted -StartKey 'HKLM:\SOFTWARE\Microsoft\Windows Search\CrawlScopeManager_Previous_Version\Windows\SystemIndex\DefaultRules' }
if (Test-Path 'HKLM:SOFTWARE\Microsoft\Windows Search\CrawlScopeManager_Previous_Version\Windows\SystemIndex\WorkingSetRules' -eq "true") {
WindowsSearchKeysDeleted -StartKey 'HKLM:SOFTWARE\Microsoft\Windows Search\CrawlScopeManager_Previous_Version\Windows\SystemIndex\WorkingSetRules' }
WindowsSearchKeysDeleted -StartKey 'HKLM:\SOFTWARE\Microsoft\Windows Search\Gather\Windows\SystemIndex\Sites\LocalHost\Paths'
# Rimuove le eventuali chiavi del registro che hanno, come valore, il SID orfano dell'account rimosso.
KeyAndItemDeleted -StartKey 'HKLM:\SOFTWARE\Microsoft\Windows Media Player NSS\3.0\MAC Access Control'
KeyAndItemDeleted -StartKey 'HKLM:\SOFTWARE\Microsoft\Windows Media Player NSS\3.0\Server Settings'
if (Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' -eq "true")
KeyAndItemDeleted -StartKey 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' }
if (Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\NetCache\PurgeAtNextLogoff' -eq "true") {
KeyAndItemDeleted -StartKey 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\NetCache\PurgeAtNextLogoff' }
Vorrei sapere se ho fatto qualche errore sintattico o logico o bug poiche` non ho una macchina a disposizione per provarlo.
GRAZIE
CIAO