balubeto
Membro dal: 08/03/2010
Post inseriti: 202
20/05/2010 18.43
ciao
ho notato che, quando si elimina correttamente un account locale di windows 7 (indipendentemente dalla sua edizione e dalla sua versione), questo sistema lascia delle tracce riferite a questo account eliminato come:
1) il suo SID nei permessi dei file o delle cartelle nelle varie unita` e partizioni del sistema operativo.
2) il suo SID nelle varie parti del registro di windows 7.
3) nelle varie chiavi numeriche del registro riferite a Windows Search dove puo` comparire nella voce url o path questo SID orfano o direttamente la directory del profilo dell`account eliminato che chiaramente non esiste piu`.
percio`, per una eliminazione completa di un account eliminato, mi occorre uno script che elimini tutti i riferimenti sopra citati.
grazie
ciao
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
31/05/2010 7.38
Efran Cobisi
Solution developer, consultant and trainer
Microsoft MVP, MCT, MCSD for Microsoft .NET, MCTS: SQL Server 2005
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
31/05/2010 10.54
Quindi, questo script:
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
param ($RemovedSID)
drives = [Environment]::GetLogicalDrives(), 'HKLM:\', 'HKCR:\', 'HKU:\', 'HKCC:\'
$drives | Get-ChildItem -Recurse -Force |
ForEach-Object {
"Verifica di {0}..." -f $_
# Recupera le ACL dell'oggetto
$acl = $_.GetAccessControl()
# Recupera le regole per il SID desiderato
$badRules = @(
$acl.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 {
$acl.RemoveAccessRule($_)
}
# Aggiorna le ACL dell'oggetto
$_.SetAccessControl($acl)
}
}
e` perfetto per i primi due punti ma, per il terzo, mi pare che occorre effettuare qualche modifica per eliminare anche la directory dell'utente eliminato. Mi sbaglio?
GRAZIE MILLE
CIAO
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
02/06/2010 7.17
Sinceramente trovo troppo azzardato rimuovere le voci del registry che contengono il SID (o il nome) dell'utente! Passi la rimozione dei permessi (che può comunque portare a problemi di sicurezza) ma la rimozione arbitraria delle chiavi del registry potrebbe rendere l'intero sistema instabile. Ripeto, secondo me questa non è una buona soluzione.
Ciao, a presto!
Efran Cobisi
Solution developer, consultant and trainer
Microsoft MVP, MCT, MCSD for Microsoft .NET, MCTS: SQL Server 2005
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
02/06/2010 11.01
Io, pero`, vorrei, in questo caso, eliminare soltanto le chiavi numeriche di Windows Search che contengono i rifferimenti alle directory locali dell'account eliminato che non esistono piu` facendo, logicamente, ricostruire da Windows 7 un nuovo indice di indicizzazione al suo riavvio.
Questa procedura (e tutto quello che scritto nei tre punti iniziali) la sto facendo da mesi su parecchie macchine di produzione senza aver nessun problema di stabilita` e di sicurezza.
Quindi, vorrei avere una procedura automatizzata per fare tutto cio` in modo da fare prima.
Dunque, mi potestri fare questo script "Pulizia" che sono sicuro che sara` utile anche a molti altri in quanto e` il classico bug di Windows 7 che, quando si elimina un account locale, Windows 7 si "dimentica" di eliminare i riferimenti suddetti.
GRAZIE ANCORA
CIAO
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
04/06/2010 19.53
Dunque, quando mi farai questo script Pulizia in modo da completare in bellezza questo thread?
GRAZIE MILLE ANCORA
CIAO
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
07/06/2010 13.14
Ok, ti voglio aiutare.
La procedura di eliminazione delle chiavi dal registry come la fai adesso? Apri manualmente l'editor e cancelli le chiavi che contengono il SID nel loro nome?
Se fosse così potresti utilizzare Get-ChildItem a fronte della chiave contenitrice di quelle oggetto della tua ricerca, applicare un filtro con Where-Object ed eliminarle con Remove-Item, specificando lo switch -Recurse per eliminare anche le eventuali chiavi nidificate.
Ciao, a presto!
Efran Cobisi
Solution developer, consultant and trainer
Microsoft MVP, MCT, MCSD for Microsoft .NET, MCTS: SQL Server 2005
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
07/06/2010 18.51
Hai fatto canestro: faccio proprio cosi` e, ogni volta, rischio di sbagliare.
Quindi, come si fa a strutturare questo script PuliziaCompletaSIDOrfano.ps1 senza fare danni?
GRAZIE MILLE
CIAO
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
07/06/2010 19.18
Ok, allora, tornando per un momento su quello che dicevamo
qui, potresti recuperare tutti gli elementi figli delle chiavi del registry coinvolte, recuperano solo quelle che contengono traccia del SID orfano, es:
$RemovedSID = 'S-1-5-21-3263097133-601255940-1672628753-1004'
Get-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Windows Search\DefaultIndexedPaths" $RemovedSID |
Remove-ItemProperty -WhatIf
Ho aggiunto lo switch
-WhatIf a Remove-Item così puoi verificare la bontà dello script prima di mandarlo effettivamente in esecuzione. Ripeto, infatti, che l'eliminazione delle chiavi del registry effettuata in questa maniera è, generalmente, una pratica che può portare a problemi di stabilità e sicurezza.
Quindi, di nuovo, ne sconsiglio l'impiego e non mi assumo responsabilità. :)
Ciao, a presto!
Efran Cobisi
Solution developer, consultant and trainer
Microsoft MVP, MCT, MCSD for Microsoft .NET, MCTS: SQL Server 2005
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
07/06/2010 20.40
Mi scusi ma e` possibile modificare
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
param ($RemovedSID)
drives = [Environment]::GetLogicalDrives(), 'HKLM:\', 'HKCR:\', 'HKU:\', 'HKCC:\'
$drives | Get-ChildItem -Recurse -Force |
ForEach-Object {
"Verifica di {0}..." -f $_
# Recupera le ACL dell'oggetto
$acl = $_.GetAccessControl()
# Recupera le regole per il SID desiderato
$badRules = @(
$acl.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 {
$acl.RemoveAccessRule($_)
}
# Aggiorna le ACL dell'oggetto
$_.SetAccessControl($acl)
}
}
in modo che appena incontra nel registro una chiave o una voce che contenga il SID orfano , cancelli direttamente la chiave ed eventuali sottochiavi o la singola voce stando attenti a non cancellare le chiavi che contengono i valori degli altri SID?
grazie mille
ciao
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
08/06/2010 7.33
E' possibile ma a mio avviso conviene mantenere le due attività separate perchè in questo secondo script sono coinvolte più entità diverse, come drive logici e hive del registry, e la ricerca all'interno del registry non è limitata alle chiavi di Windows Search (quindi potremmo andare incontro a possibili problemi di instabilità). Delegando all'altro script l'attività specifica stiamo minimizzando il fattore di rischio legato all'eliminazione delle chiavi.
Ciao, a presto
Efran Cobisi
Solution developer, consultant and trainer
Microsoft MVP, MCT, MCSD for Microsoft .NET, MCTS: SQL Server 2005
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
08/06/2010 10.33
Ok. E` possibile annalizzare ricorsivamente tutte le sottochiavi del ramo HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Search\ ed eliminare tutte le (sotto)chiavi che hanno una voce che ha, come valore, un valore che includesse (anche in parte) l'intero SID orfane? Se si`, come si fa a fare cio' cosi` che io possa inserirlo all'inizio dello script principale?
GRAZIE MILLE ANCORA
CIAO
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
08/06/2010 13.14
Ho incomiciato ad inserire nello script le chiavi da eliminare del SID eliminato:
[powershell]
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
param ($RemovedSID)
# Cancella le chiavi rimaste del SID orfane.
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows Media Player\3.0\MAC Access Control" $RemovedSID |
Remove-ItemProperty
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows Media Player\3.0\Server Settings" $RemovedSID |
Remove-ItemProperty
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\NetCache\PurgeAtNextLogoff" $RemovedSID |
Remove-ItemProperty
drives = [Environment]::GetLogicalDrives(), 'HKLM:\', 'HKCR:\', 'HKU:\', 'HKCC:\'
$drives | Get-ChildItem -Recurse -Force |
ForEach-Object {
"Verifica di {0}..." -f $_
# Recupera le ACL dell'oggetto
$acl = $_.GetAccessControl()
# Recupera le regole per il SID desiderato
$badRules = @(
$acl.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 {
$acl.RemoveAccessRule($_)
}
# Aggiorna le ACL dell'oggetto
$_.SetAccessControl($acl)
}
}
[powershell]
Giusto?
Una curiosita`: Se una delle mie chiavi <chiavi>\SID-da-eliminare non esiste, lo script prosegue o si ferma? Spero che prosegua.
Ora, come si fa ad esaminare il ramo HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Search\ ?
grazie
ciao
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
08/06/2010 13.16
Ho incomiciato ad inserire nello script le chiavi da eliminare del SID eliminato:
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
param ($RemovedSID)
# Cancella le chiavi rimaste del SID orfane.
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows Media Player\3.0\MAC Access Control" $RemovedSID |
Remove-ItemProperty
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows Media Player\3.0\Server Settings" $RemovedSID |
Remove-ItemProperty
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\NetCache\PurgeAtNextLogoff" $RemovedSID |
Remove-ItemProperty
drives = [Environment]::GetLogicalDrives(), 'HKLM:\', 'HKCR:\', 'HKU:\', 'HKCC:\'
$drives | Get-ChildItem -Recurse -Force |
ForEach-Object {
"Verifica di {0}..." -f $_
# Recupera le ACL dell'oggetto
$acl = $_.GetAccessControl()
# Recupera le regole per il SID desiderato
$badRules = @(
$acl.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 {
$acl.RemoveAccessRule($_)
}
# Aggiorna le ACL dell'oggetto
$_.SetAccessControl($acl)
}
}
Giusto?
Una curiosita`: Se una delle mie chiavi <chiavi>\SID-da-eliminare non esiste, lo script prosegue o si ferma? Spero che prosegua.
Ora, come si fa ad esaminare il ramo HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Search\ ?
grazie
ciao
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
08/06/2010 18.49
Ho ridotto ancora il margine di errore: basta annalizzare le chiavi numeriche dei seguenti rami:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Search\CrawlScopeManager\Windows\SystemIndex\DefaultRules
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Search\CrawlScopeManager\Windows\SystemIndex\WorkingSetRules
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Search\CrawlScopeManager_Previous_Version\Windows\SystemIndex\DefaultRules
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Search\CrawlScopeManager_Previous_Version\Windows\SystemIndex\WorkingSetRules
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Search\Gather\Windows\SystemIndex\Sites\LocalHost\Paths
e cercare se, nella voce "URL" o "Path", compaia, come valore, una directory contenente il SID del`utente eliminato o il nome di questo utente . nel caso in cui venga trovata questa corrisondenza , basta istruire lo script che cancelli la relativa chiave numerica .
logicamente , dopo aver riavviato il computer , occorre creare un nuovo indice in modo che windows 7 riordini le sue chiavi numeriche .
quindi , avrai un sistema con un sistema di indicizzazione funzionante perfettamente (ho provato a farlo a mano su parecchi computer e non ho avuto mai nessun problema )
quindi , come si fa a cancellare queste chiavi numeriche in modo automatico?
grazie
ciao
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
08/06/2010 20.58
Se desideri eliminare dei valori puoi utilizzare la pipeline con Get-ItemProperty, presentata nei post precedenti.
Altrimenti, nel caso desiderassi eliminare delle chiavi ti basterebbe sostituire a Get-ItemProperty una chiamata a Get-ChildItem e risolveresti il problema.
Ciao, a presto!
Efran Cobisi
Solution developer, consultant and trainer
Microsoft MVP, MCT, MCSD for Microsoft .NET, MCTS: SQL Server 2005
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
09/06/2010 9.09
il guaio e` che occorre analizzare tutte le chiavi numeriche dei rami suddetti e cercare fra essi quelli che hanno, come voce URL o Path, il valore che contiene il SID orfano oppure il nome dell`account eliminato nella sua directory. quindi come faccio ad individuare automaticamente queste chiavi numeriche senza dover analizzare a mano una per una ?
grazie
ciao
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
09/06/2010 19.58
Quindi, come faccio a cercare un valore nelle voci URL o Path nelle chiavi suddette ?
grazie ancora ed AIUTO!!!
ciao
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
09/06/2010 20.48
Ciao balubeto,
non ho avuto il tempo di testare questo script ma dovrebbe fare al caso tuo. Parte da una chiave (come quelle che hai indicato) e procedere, ricorsivamente ad analizzarne le proprietà: se una di queste è Path o Url allora elimina la chiave e tutte le chiavi figlie.
Sempre meglio testarlo in una macchina virtuale prima di eseguirlo in produzione, comunque...
$startKey = 'HKLM:\...'
Get-ChildItem $startKey -Recurse |
ForEach-Object {
$shouldRemove = (@(Get-ItemProperty $_ url).Count -gt 0) -or (@(Get-ItemProperty $_ path).Count -gt 0)
if (shouldRemove) {
$_ | Remove-Item -Recurse
}
}
Ciao, a presto.
Efran Cobisi
Solution developer, consultant and trainer
Microsoft MVP, MCT, MCSD for Microsoft .NET, MCTS: SQL Server 2005
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
10/06/2010 9.43
Mi pare che tale script che cancelli tutte le chiavi numeriche che hanno come voce URL o Path indipendentemente dal loro valore . quindi come devo trasformare questo script in modo che cancelli soltanto quelle chiavi numeriche aventi come voce URL o Path il valore del SID orfano o del nome dell`account eliminato incluso in tale valore ?
grazie
ciao
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
10/06/2010 11.25
Mi pare che tale script cancelli tutte le chiavi numeriche che hanno come voce URL o Path indipendentemente dal loro valore. Quindi, come devo trasformare questo script in modo che cancelli soltanto quelle chiavi numeriche aventi, come voce URL o Path, il valore del SID orfano o del nome dell`account eliminato incluso in tale valore?
grazie
ciao
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
10/06/2010 11.56
Scusa di nuovo ma shouldRemove che comando e`?
GRAZIE MILLE
CIAO
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
11/06/2010 12.27
Ho proprio bisogno di te per completare il mio lavoro.
GRAZIE MILLE e SCUSA ANCORA
CIAO
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
11/06/2010 14.00
Ciao balubeto,
hai ragione, lo script che ti ho fornito non testava il valore delle due proprietà (url e path).
Eccolo aggiornato:
$startKey = 'HKLM:\...'
$removedSid = '...'
Get-ChildItem $startKey -Recurse |
ForEach-Object {
# Verifica Url
$shouldRemove = @(Get-ItemProperty $_ url | Where-Object { $_.url -eq $removedSid }).Count -gt 0)
# Verifica Path
$shouldRemove = $shouldRemove -or (@(Get-ItemProperty $_ path | Where-Object { $_.path -eq $removedSid }).Count -gt 0)
# Rimozione chiave corrente e sottochiavi
if (shouldRemove) {
$_ | Remove-Item -Recurse -WhatIf
}
}
$shouldRemove, invece, è una variabile. Ti invito, per piacere, a studiare i
meccanismi di base della piattaforma di scripting della shell, altrimenti corri il rischio di bloccarti su altri punti.
Ciao, a presto.
Efran Cobisi
Solution developer, consultant and trainer
Microsoft MVP, MCT, MCSD for Microsoft .NET, MCTS: SQL Server 2005
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
12/06/2010 19.24
Guarda questo script completo:
# 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)
# 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.
$StartKey = 'HKLM:\SOFTWARE\Microsoft\Windows Search\CrawlScopeManager\Windows\SystemIndex\DefaultRules'
Get-ChildItem $StartKey -Recurse |
ForEach-Object {
# Verifica URL
$ShouldRemove = @(Get-ItemProperty $_ URL | Where-Object { $_.URL -eq $RemovedSID or $RemovedAccountNameDeleted}).Count -gt 0)
# Rimozione chiave corrente e sottochiavi
if (shouldRemove) {
$_ | Remove-Item -Recurse -WhatIf
}
}
$StartKey = 'HKLM:\SOFTWARE\Microsoft\Windows Search\CrawlScopeManager\Windows\SystemIndex\WorkingSetRules'
Get-ChildItem $StartKey -Recurse |
ForEach-Object {
# Verifica URL
$ShouldRemove = @(Get-ItemProperty $_ URL | Where-Object { $_.URL -eq $RemovedSID or $RemovedAccountNameDeleted}).Count -gt 0)
# Rimozione chiave corrente e sottochiavi
if (shouldRemove) {
$_ | Remove-Item -Recurse -WhatIf
}
}
$StartKey = 'HKLM:\SOFTWARE\Microsoft\Windows Search\CrawlScopeManager_Previous_Version\Windows\SystemIndex\DefaultRules'
Get-ChildItem $StartKey -Recurse |
ForEach-Object {
# Verifica URL
$ShouldRemove = @(Get-ItemProperty $_ URL | Where-Object { $_.URL -eq $RemovedSID or $RemovedAccountNameDeleted}).Count -gt 0)
# Rimozione chiave corrente e sottochiavi
if (shouldRemove) {
$_ | Remove-Item -Recurse -WhatIf
}
}
$StartKey = 'HKLM:\SOFTWARE\Microsoft\Windows Search\CrawlScopeManager_Previous_Version\Windows\SystemIndex\WorkingSetRules'
Get-ChildItem $StartKey -Recurse |
ForEach-Object {
# Verifica URL
$ShouldRemove = @(Get-ItemProperty $_ URL | Where-Object { $_.URL -eq $RemovedSID or $RemovedAccountNameDeleted}).Count -gt 0)
# Rimozione chiave corrente e sottochiavi
if (shouldRemove) {
$_ | Remove-Item -Recurse -WhatIf
}
}
$StartKey = 'HKLM:\SOFTWARE\Microsoft\Windows Search\Gather\Windows\SystemIndex\Sites\LocalHost\Paths'
Get-ChildItem $StartKey -Recurse |
ForEach-Object {
# 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
}
}
# Rimuove le eventuali chiavi del registro che hanno, come valore, il SID orfano dell'account rimosso.
Set-Location 'HKLM:\SOFTWARE\Microsoft\Windows Media Player NSS\3.0\MAC Access Control'
Remove-Item '$RemovedSID' -WhatIf
Set-Location 'HKLM:\SOFTWARE\Microsoft\Windows Media Player NSS\3.0\Server Settings'
Remove-Item '$RemovedSID' -WhatIf
Set-Location 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'
Remove-Item '$RemovedSID' -WhatIf
# Rimuove l'eventuale voce del registro che ha, come valore, il SID dell'account rimosso.
set-Location 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\NetCache\PurgeAtNextLogoff'
Remove-ItemProperty '$RemovedSID' -WhatIf
Ho fatto molte modifiche per far si` che tale script esegua i miei tre punti iniziali evitando, pero`, che questo script distruga Windows 7. Prova a vericare se e` tutto coretto ma, sopratutto, se si puo` migliorarlo strutturalmente.
Inoltre, controlla se la variabile $ShouldRemove adempia ancora al suo dovere poiche` ho modificato per fare in modo che riesca a controllare se la directory contenga il SID orfano o il nome dell`account rimosso.
Se una chiave o voce esaminata dallo script non esiste, lo script dovrebbe proseguire anche perche` ho notato che in alcune edizioni di windows 7 alcune chiavi o alcune voci non esistono. Devo far qualcosa per far si che non compaia qualche errore o che non si blocchi a causa di cio` ?
Se questo script lo eseguo da una chiavetta o da un` unita` di rete , funzina lo stesso oppure creerebbe qualche guaio?
grazie
ciao
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
12/06/2010 19.30
Ho fatto molte modifiche per far si` che tale script esegua i miei tre punti iniziali evitando, pero`, che questo script distruga Windows 7. Prova a vericare se e` tutto coretto ma, sopratutto, se si puo` migliorarlo strutturalmente.
Inoltre, controlla se la variabile $ShouldRemove adempia ancora al suo dovere poiche` l'ho modificata per fare in modo che riesca a controllare se la directory contenga il SID orfano o il nome dell`account rimosso.
Se una chiave o voce esaminata dallo script non esiste, lo script dovrebbe proseguire anche perche` ho notato che in alcune edizioni di windows 7 alcune chiavi o voci non esistono. Devo far qualcosa per far si che non compaia qualche errore o che non si blocchi a causa di cio` ?
Se questo script lo eseguo da una chiavetta o da un` unita` di rete , funzina lo stesso oppure creerebbe qualche guaio?
grazie
ciao
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
14/06/2010 19.03
Mi raccomando di non abbandonarmi proprio ora che sono quasi alla fine di tale script.
GRAZIE MILLE ANCORA
CIAO
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
14/06/2010 21.01
Ciao balubeto,
non ti posso dire se lo script farà danni nel sistema o meno perchè, lo ripeto, eliminare chiavi e valori dal registry (specie se non se ne conoscono le implicazioni più profonde) può portare all'instabilità di Windows! Quindi, ripeto, sono contrario a questa attività!
Detto questo, lo script sembra essere a posto ma se fossi in te cercherei di isolare il codice di rimozione delle chiavi in una funzione (function) di PowerShell, da richiamare di volta in volta per ogni chiave interessata. Così facendo la dimensione e la complessità dello script saranno automaticamente ridotte.
Ciao, a presto!
Efran Cobisi
Solution developer, consultant and trainer
Microsoft MVP, MCT, MCSD for Microsoft .NET, MCTS: SQL Server 2005
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
15/06/2010 9.20
Mi potestri fare un esempio su come si fa a fare una funzione per fare cio` in modo da ridurre di dimensioni il mio script?
GRAZIE MILLE
CIAO
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
15/06/2010 9.23
Mi potestri fare un esempio su come si fa a fare una funzione per fare cio` in modo da ridurre la complessita` del mio script?
GRAZIE MILLE
CIAO
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
15/06/2010 9.26
Ciao balubeto,
guarda qui, ci sono diversi esempi che dovrebbero portarti sulla buona strada.
A presto!
Efran Cobisi
Solution developer, consultant and trainer
Microsoft MVP, MCT, MCSD for Microsoft .NET, MCTS: SQL Server 2005
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
15/06/2010 20.18
Ecco lo script semplificato:
# 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'
WindowsSearchKeysDeleted -StartKey 'HKLM:\SOFTWARE\Microsoft\Windows Search\CrawlScopeManager_Previous_Version\Windows\SystemIndex\DefaultRules'
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'
KeyAndItemDeleted -StartKey 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'
KeyAndItemDeleted -StartKey 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\NetCache\PurgeAtNextLogoff'
Corretto?
Le mie due funzioni sono corrette o possono essere migliorate?
Quando si definisce una variabile su due righe, come si fa ad andare acapo correttamente?
grazie mille
ciao
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
15/06/2010 21.41
mi e` venuto in mente un particolare :
occorre anche verificare se una chiave non numerica esiste o no poiche`, per me , si rischia di cancellare una chiave o una voce non voluta . quindi , se la mia considerazione e` corretta come si fa ad evitare che accada cio` ?
grazie
ciao
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
16/06/2010 18.40
Mi potestri dare ancora una mano a concludere questo script, oh mio professore?
GRAZIE MILLE
CIAO
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
17/06/2010 11.00
Scusami ancora ma ho proprio bisogno dei TUOI preziosi aiuti.
GRAZIE MILLE e SCUSA ANCORA del disturbo.
CIAO
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
18/06/2010 9.35
Scusa ma sei ancora disponibile ad aiutarmi?
GRAZIE
CIAO
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
18/06/2010 10.01
Ciao balubeto,
certo che sono disposto ad aiutarti ma in questi ultimi due giorni sono stato full con un progetto... Ma adesso sono qui. ;)
Allora, non ho provato il tuo script ma mi è saltato subito all'occhio il fatto che il blocco condizionale if/else di KeyAndItemDeleted non ha le parentesi graffe chiuse correttamente: conviene che tu gli dia un'occhiata.
Cosa vuol dire definire una variabile su due righe? Mi fai un esempio che ti da errore, per piacere?
E cosa vuoi dire con "verificare se una chiave non numerica esiste"?
Ciao, a presto!
Efran Cobisi
Solution developer, consultant and trainer
Microsoft MVP, MCT, MCSD for Microsoft .NET, MCTS: SQL Server 2005
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
18/06/2010 13.01
Va bene cosi`:
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 }
}
}
La variabile:
$ShouldRemove = $ShouldRemove -or (@(Get-ItemProperty $_ Path | Where-Object { $_.Path -eq $RemovedSID or $RemovedAccountNameDeleted}).Count
-gt 0)
definita su due righe, va bene, oppure occorre qualche segno particolare per indicare al compilatore che tale variabile e` definita su due righe?
le chiavi non numeriche che intendevo sono le chiavi analizzate dalla funzione KeyAndItemDeleted . la mia paura e` che , quando non trova nel registro una chiave da analizzare come WindowsSearchKeysDeleted -StartKey 'HKLM:\SOFTWARE\Microsoft\Windows Search\CrawlScopeManager_Previous_Version\Windows\SystemIndex\DefaultRules' o come KeyAndItemDeleted -StartKey 'HKLM:\SOFTWARE\Microsoft\Windows Media Player NSS\3.0\MAC Access Control', questa funzione mi cancelli qualche altra chiave o qualche voce perche` in questa funzione manca , per me , il controllo se effettivamente la chiave analizzata esista o meno .
grazie
ciao
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
18/06/2010 13.14
Ciao,
nel blocco if manca la graffa di chiusura, mentre nell'else è doppia:
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
}
La variabile va bene così, in PowerShell non c'è una dichiarazione esplicita delle variabili.
Per quanto riguarda le chiavi non ti preoccupare: se Get-ChildItem non trova il percorso va in errore ed il resto della pipeline della funzione non viene eseguito.
Ciao, a presto!
Efran Cobisi
Solution developer, consultant and trainer
Microsoft MVP, MCT, MCSD for Microsoft .NET, MCTS: SQL Server 2005
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
18/06/2010 16.54
Anche la funzione KeyAndItemDeleted va in errore se li do da mangiare una chiave che non esiste?
Un'ulteriore conferma: Se le due funzioni vanno in errore per una chiave inesistente, lo script prosegue con l'istruzione successiva senza visualizzare alcun errore. Giusto?
GRAZIE
CIAO
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
18/06/2010 17.05
Sì, entrambe le funzioni.
Considera che Get-ChildItem e Set-Location di default generano in questi casi errori non fatali, che non terminano lo script ma comunque visualizzano a video un messaggio di errore.
Ciao!
Efran Cobisi
Solution developer, consultant and trainer
Microsoft MVP, MCT, MCSD for Microsoft .NET, MCTS: SQL Server 2005
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
18/06/2010 17.56
# 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
}
}
Un momento: Se Set-Location genera un errore, l'istruzione "Remove-Item '$RemovedSID' -WhatIf" viene eseguita lo stesso o no? Se si`, come devo fare ad evitare cio`?
Come si fa a non visualizzare gli eventuali errori suddetti?
GRAZIE
CIAO
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
19/06/2010 11.31
Quando vedi il post precedente, mi potestri rispondere subito in quanto ho un po` di premura di concludere e di provare questo script con una certa sicurezza.
GRAZIE MILLE
CIAO
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
19/06/2010 12.41
Un'altra cosa: Lo script esamina anche i file nascosti e di sistema per eliminare l'eventuale SID orfano? Spero di si` altrimenti come si fa a fare cio`?
GRAZIE MILLE
CIAO
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
19/06/2010 19.45
Quindi, le mie ultime domande e chiarimenti sono fondati o sono SOLO paranoie prima della GRANDE prova-presentazione senza messaggi d'errore?
Ho notato che il SID orfano da eliminare risiede anche nei file/directory nascosti o di sistema.
Da quanto ho potuto capire, la routine
# 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)
}
}
prende gli ACL di un oggetto, rimuove l'eventuale SID orfano con i suoi permessi e restiusce all'oggetto gli ACL "puliti". Questo ciclo avviene per ogni oggetti di ogni contenitore esaminato. Giusto?
GRAZIE ANCORA
CIAO
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
20/06/2010 11.27
Questa notte, mi e` venuto in mente che la funzione KeyAndItemDeleted si puo` scrivere anche cosi`:
# 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' {
Remove-ItemProperty '$StartKey\$RemovedSID' -WhatIf
}
else {
Remove-Item '$StartKey\$RemovedSID' -WhatIf
}
}
Giusto? Se si`, questa soluzione, oltre a semplificare la funzione, evita, in modo assoluto, che un'altra chiave venga cancellata per sbaglio. Esato?
Ora, mi puoi insegnare come si fa a non visualizzare l'errore quando dico a Remove-Item di rimuovere una chiave che non esiste in quanto ho notato che alcune chiavi esaminate non ci sono in alcune edizioni di Windows 7?
Sperando che tu, cortesemente, mi risponda ancora a tutte le domande e chiarimenti scritti in questo Week-End, ti auguro Buon lavoro.
GRAZIE MILLE
CIAO
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
20/06/2010 18.05
Se scrivo:
# 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' {
Remove-ItemProperty '$StartKey\$RemoveKey' | Out-Null
}
else {
Remove-Item '$StartKey\$RemovedKey' | Out-Null
}
}
non viene visualizzato nessun messaggio d'errore nel caso in cui la voce o la chiave da rimuovere non esistesse. Giusto?
GRAZIE
CIAO
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
21/06/2010 10.38
Credo di aver trovato una soluzione piu` elegante per evitare i messaggi d'errore causati da quelle chiavi o voci che possono esserci o non esserci nel registro:
# 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' }
Giusto?
Potestri dare un'occhiata a tutto lo script per controllare se c'e` qualche errore?
GRAZIE MILLE ANCORA
CIAO
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
21/06/2010 13.24
Ciao balubeto,
ti chiedo scusa ma sto finendo di preparare la newsletter di domani; tieni duro ancora un giorno e poi esamino il tuo script!
Ciao, a presto!
Efran Cobisi
Solution developer, consultant and trainer
Microsoft MVP, MCT, MCSD for Microsoft .NET, MCTS: SQL Server 2005
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
21/06/2010 17.03
Ok, tengo duro anche perche` sono certo che farai un esame accurato di questo script MOLTO delicato.
BUON LAVORO
GRAZIE MILLE ANCORA
CIAO
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
23/06/2010 18.51
Ti ricordi che ho bisogno che tu mi controlli il mio script?
GRAZIE MILLE
CIAO
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
24/06/2010 12.27
Hai gia` controllato il mio script?
GRAZIE MILLE
CIAO
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
24/06/2010 19.08
Scusa ancora ma sei ancora vivo?
GRAZIE MILLE
CIAO
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
25/06/2010 10.16
Balubeto, tieni presente che:
1) se non ti rispondo è perchè sono impegnato con altro;
2) il supporto offerto su powershell.it è completamente gratuito;
3) tendenzialmente su questo forum vengono fornite risposte "spot" e non creazioni e verifiche dell'evoluzione di interi script, magari con risvolti complessi come il tuo.
Detto questo, devo dire la tua insistenza nel chiedere continuamente nuove risposte - in particolare nel tuo ultimo post - non mi piace per niente e mi vedo costretto ad invitarti a postare la tua domanda altrove.
Ciao
Efran Cobisi
Solution developer, consultant and trainer
Microsoft MVP, MCT, MCSD for Microsoft .NET, MCTS: SQL Server 2005
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
01/07/2010 12.03
Credo che questo script
# 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.
# $RemAccNameDel 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,$RemAccNameDel)
# 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 $RemAccNameDel}).Count -gt 0
# Verifica Path
$ShouldRemove = $ShouldRemove -or (@(Get-ItemProperty $_ Path | Where-Object { $_.Path -eq $RemovedSID or $RemAccNameDel}).Count -gt 0
# Rimozione chiave corrente e sottochiavi
if ($shouldRemove) {
$_ | Remove-Item -Recurse
}
}
}
# Funzione che rimuove le chiavi o le voci del registro contenenti ancora il SID orfano dell'account rimosso.
function KeyAndItemDeleted ($StartKey)
{
if ($StartKey -eq 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\NetCache\PurgeAtNextLogoff') {
set-Location '$StartKey'
Remove-ItemProperty '$RemovedSID'
}
else {
Set-Location '$StartKey'
Remove-Item '$RemovedSID'
}
}
# 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") {
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") {
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") {
KeyAndItemDeleted -StartKey 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'}
if (Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\NetCache\PurgeAtNextLogoff") {
KeyAndItemDeleted -StartKey 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\NetCache\PurgeAtNextLogoff'}
sia sintassicamente corretto. Giusto?
Prima di avviarlo, tramite un'operazione pianificata scrivendo:
schtasks /create /tn "Rimozione riferimenti rimasti account rimosso" /tr "C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe -ExecutionPolicy Unrestricted -file "<Unita`_profili_e_dati>:\Users\<Nome_account_amministrativo>\Documents\RimRifRimAccountrimosso.ps1 -RemovedSID '<SID_Account_rimosso>'
-RemAccNameDel '<Nome_account_rimosso'" /ru System /sc ONSTART /mo ONCE /z
vorrei avere la certezza che non ci siano errori di sintassi e logici.
Quindi, potestri dare un'occhiata in modo da iniziare subito la fase di test con una certa certezza.
GRAZIE MILLE
CIAO
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
01/07/2010 12.22
L'operazione pianificata e` venuta scritta male. Ora, provo a scriverla cosi`:
schtasks /create /tn "Rimozione riferimenti rimasti account rimosso" /tr "C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe -ExecutionPolicy Unrestricted -file "<Unita`_profili_e_dati>:\Users\<Nome_account_amministrativo>\Documents\RimRifRimAccountrimosso.ps1 -RemovedSID '<SID_Account_rimosso>' -RemAccNameDel '<Nome_account_rimosso'" /ru System /sc ONSTART /mo ONCE /z
CIAO