balubeto
Membro dal: 08/03/2010
Post inseriti: 202
07/05/2010 18.00
CIAO
Come devo fare ad individuare e cancellare gli utenti locali sconosciuti (ossia, quelli utenti che, nel registro di Windows, e` rimasto solo i loro SID) di Windows 7 da tutti i suoi file/cartelle?
GRAZIE
CIAO
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
07/05/2010 18.41
CIAO
Come devo fare ad individuare e cancellare gli utenti locali sconosciuti (ossia, quelli utenti che non hanno piu` un nome nel registro di Windows) di Windows 7 dai permessi di tutti i suoi file/cartelle?
GRAZIE
CIAO
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
07/05/2010 18.58
Ciao!
Perchè vuoi eliminare gli utenti dalla lista dei SID associati ai file/cartelle se tanto non esistono più?
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/05/2010 19.38
Perche` sto creando un sistema pulito e persornalizzato e mi rimangono soltanto da eliminare questi utenti sconosciuti dai file/cartelle e dal registro.
Quindi, mi potestri aiutare?
GRAZIE
CIAO
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
10/05/2010 10.43
Ho provato con il comando icacls ma, quando incontra un file che ha un utente sconosciuto fra i suoi permessi, non mi dice il SID di questo utente ma viene visualizzato il messaggio "Non e` stato effettuato alcun mapping tra nomi di account e ID di sicurezza (SID).". Poi, il comando icacls non mi cancella dal registro di Windows 7 i rifferimenti rimasti di quel SID dell`utente sconosciuto.
Quindi, hai qualche idea su come risolvere tale problema?
GRAZIE
CIAO
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
10/05/2010 12.29
Ciao balubeto,
per rimuovere i SID orfani dal file system puoi utilizzare il tool a riga di comando
subinacl: forse conviene, anziché creare uno script PowerShell ad hoc. ;)
La sintassi di subinacl è semplice. Per rimuovere i SID degli utenti eliminati dal dominio XYZ dal disco C:, ad esempio, puoi usare questo comando:
subinacl /subdirectories C:\*.* /cleandeletedsidsfrom=XYZ
Aggiungendo il parametro
/testmode puoi richiedere al comando di visualizzare a video le operazioni da compiere senza effettuarle, utilissimo prima di applicare modifiche importanti al filesystem:
subinacl /subdirectories C:\*.* /cleandeletedsidsfrom=XYZ /testmode
Non l'ho provato direttamente, ma, stando alla documentazione, in modo analogo al filesystem per agire sulle ACL del registry è sufficiente utilizzare il parametro
/subkeyreg, in modo simile a questo:
subinacl.exe /subkeyreg "HKEY_LOCAL_MACHINE\Software" /cleandeletedsidsfrom=XYZ /testmode
Se il SID da rimuovere è di un utente locale è sufficiente utilizzare, come al solito, il nome del PC al posto del dominio.
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/05/2010 15.10
Purtroppo, la vecchia utility subinacl non funziona piu` tanto bene con Windows 7 a 32 bit ed a 64 bit (penso che sia una questione di una versione legermente diversa del File-System e della struttura del registro di Windows).
E` tanto difficile scrivere uno script in PowerShell che faccia cio`?
GRAZIE MILLE
CIAO
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
11/05/2010 18.57
Ho trovato
questo documento ma, essendo poco pratico di questo linguaggio, qualcuno mi potebbre dire che cosa dovrei scrivere, nel prompt dei comandi, la sequenza delle istruzioni per rimuovere da tutti i file/cartelle (e, se fosse possibile, anche dal registro) di un sistema Windows 7 a 32 bit ed a 64 bit tutti i SID orfani?
GRAZIE MILLE
CIAO
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
11/05/2010 21.13
Ciao balubeto,
prima di postare il link a subinacl l'ho testato personalmente su Windows 7 senza alcun problema.
Riguardo alla "difficoltà" di scrivere lo script con PowerShell... Beh, nulla è difficile. Solo che ci vuole tempo, specialmente se l'attività in questione non è tra quelle dell'amministrazione quotidiana! Quindi utilizzare un tool esistente, spesso, è la soluzione migliore.
Meglio non reinventare l'acqua calda, se possibile!
Ad ogni modo, ho creato per te lo script PowerShell che segue; funziona grazie ad un SID di partenza, che corrisponde al SID dell'utente eliminato (non ho incluso lo script per recuperare i SID orfani perchè nel tuo caso l'utente è solo uno). Lo script cicla all'interno di tutti i file e le cartelle a partire da quella corrente, in modo ricorsivo. Ne recupera le ACL e rimuove tutte quelle relative al SID di partenza.
Eccolo:
$RemovedSID = 'S-1-5-21-3263097133-601255940-1672628753-1004'
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) {
"`tRimozione regole orfane (elementi trovati: {0})..." -f $badRules.Count
# Rimuove le regole orfane
$badRules |
ForEach-Object {
$acl.RemoveAccessRule($_)
}
# Aggiorna le ACL dell'oggetto
$_.SetAccessControl($acl)
}
}
Nell'esempio il SID è
S-1-5-21-3263097133-601255940-1672628753-1004, valore che ovviamente devi modificare prima di far girare il codice.
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/05/2010 11.05
GRAZIE ANCORA
Alcune curiosita`:
1) Le istruzioni di tale script si possono scrivere direttamente dalla shell di Powershell o no?
2) Tale script e` applicabile sul registro per poter elimininare quel SID orfane anche dal registro? Se no, come si fa ad aggiungere tale funzionalita`?
3) Come si fa ad aggiungere a questo script due variabile in modo da scrivere dal prompt dei comandi Nome_script.ps Directory-iniziale SID-Orfane ?
4) E` meglio eseguire tale script in modalita` provvisoria, per evitare che Windows faccia storie, o no?
GRAZIE MILLE ANCORA
CIAO
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
12/05/2010 13.20
Di niente.
1) Certo che sì: ti consiglio di dare un'occhiata alla sezione
Tutorial per prendere maggiore confidenza con la shell.
2) Sì, si può utilizzare anche per il registry, utilizzando il concetto di provider di PowerShell. Ti basta lanciare lo script fornendo al Get-ChildItem iniziale un percorso nel registry, come ad esempio HKLM:\Software.
3) Puoi utilizzare l'istruzione
param all'inizio dello script, specificando le due variabili il cui valore è fornito come argomento allo script esterno. Anche qui, ti consiglio di dare un'occhiata alla sezione tutorial, prima.
4) Manterrei l'avvio normale, senza passare per la modalità provvisoria.
Se parteciperai all'
evento gratuito a Cesena, il 28 maggio, parlerò di PowerShell partendo dalle basi: se stai imparando ad utilizzare la shell forse potrebbe esserti utile partecipare. ;)
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/05/2010 19.08
1) In pratica, se volessi scrivere direttamente dal prompt dei comandi, dovrei scrivere come sei andato a capo tu tralasciando solo gli spazi di indentazione. Esato?
2) Non riesco a capire dove mettere il percorso del registro. Se volessi controllare l'intero registro dalla sua radice Computer, come dovrei scrivere?
GRAZIE MILLE
CIAO
P.S: Scusa ma sono un po` duro di compredonio.
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
12/05/2010 21.00
Ciao,
1) in generale PowerShell è molto flessibile riguardo gli spazi e gli a capo, però se non sei molto pratico ti consiglio di lasciare lo script così com'è;
2) per utilizzare il registry devi partire da una delle sue hive, come HKLM, HKCU, etc.
Ti basta specificare il percorso desiderato (per HKLM:\) direttamente di seguito al cmdlet Get-ChildItem (dai un'occhiata alla
Guida Comandi), in modo simile a questo:
# ...
Get-ChildItem HKLM:\ -Recurse -Force |
ForEach-Object { # ...
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
13/05/2010 10.27
1) Perche` nel tuo esempio, non hai messo l'opzione -path a Get-ChildItem?
2) Se volessi esaminaretutti i hive del registro in un unico processo, che cosa dovrei scrivere? Tale scrips mi elimina le chiavi o le voci o entrambi (meglio) che hanno come valore i SID orfane senza far danni al sistema?
3) Se volessi esaminare le partizioni C e D, potrei scrivere:
Get-ChildItem -path C:\, D:\ -Recurse -Force |
ForEach-Object {
GRAZIE
CIAO
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
13/05/2010 13.57
1) Perchè -Path è un parametro posizionale, si può anche non specificare esplicitamente.
2 + 3) Se vuoi esaminare C:\, D:\, HKLM e HKCU tutte insieme puoi usare uno script simile a questo:
Get-ChildItem C:\, D:\, HKLM:\, HKCU:\ -Recurse -Force
Per quanto riguarda gli eventuali danni al sistema, in teoria non dovrebbero esserci problemi ma prima di fare modifiche fai un backup. In ogni caso le informazioni che trovi su questo portale sono fornite a scopo puramente didattico e la responsabilità per eventuali danni è da imputarsi a chi utilizza il codice, quindi fai sempre attenzione. ;)
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
13/05/2010 19.47
In pratica, lo script
$RemovedSID = '<SID_Utente_sconosciuto>'
Get-ChildItem C:\, D:\, HKCR:\, HKCU:\, HKLM:\, HKU:\, HKCC -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)
}
}
individua e rimuove tutte le occorenze rimaste del SID di un utente sconosciuto dai permessi di tutti i file/cartelle delle partizioni C e D e dall'intero registro. Giusto?
I commenti e le frasi sono ancora appropriate o occorre modificarli?
GRAZIE ANCORA
CIAO
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
14/05/2010 12.56
Ciao,
alcune osservazioni:
1) attenzione all'HKCC, mancano i due punti ed il backslash;
2) di default la shell non ha i drive HKCR, HKU e HKCC. Quindi se vuoi utilizzarli è necessario prima crearli, così:
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
3) In teoria HKCU e HKCC dovrebbero essere già compresi negli altri hive, quindi potresti ometterli.
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
14/05/2010 17.07
Ho pensato ad un particolare:
E` inutile analizzare gli hive dove non ci potranno mai essere dei SID orfani derivanti da utenti locali .
quindi , mi potresti dire gli hive o addirittura le chiavi del registro dove ci possono essere dei SID orfani in modo da ottimizzare il mio script?
grazie
ciao
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
20/05/2010 12.56
Guarda, indicativamente qualsiasi chiave può essere protetta, quindi non credo valga la pena di fare questo tipo di stima. Procederei tranquillamente su tutti gli hive.
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
20/05/2010 13.16
Non ho ben capito quali sono gli hive validi in questo linguaggio di programmazione . me li puoi elencare di nuovo?
grazie
ciao
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
20/05/2010 13.52
Ciao,
gli hive sono quelli del registry di Windows e sono indipendenti da PowerShell.
Prima lanciare il tuo script devi registrare questi drive in PowerShell, così:
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
I drive da utilizzare, dunque, saranno:
HKLM:
HKCR:
HKU:
HKCC:
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
20/05/2010 17.37
Quindi, lo script completo e`:
$RemovedSID = '<SID_Account_da_eliminare>'
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
Get-ChildItem C:\, D:\, HKLM:\, HKCR:\, HKU:\, HKCC:\ -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)
}
}
Esiste una funzione che da, come risultato, tutte le partizioni dei hard-disk locali visti dal sistema in modo da non dover ogni volta modificare a mano tale script per elencare tutte le unita`/partizioni corrette?
GRAZIE
CIAO
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
20/05/2010 18.28
Ciao,
sì, lo script è corretto.
Per lo script che recupera i dischi non c'è problema però prima è meglio se dai un'occhiata al tutorial e prendi un po' di pratica con PowerShell. ;)
Il fatto è che, come hai notato, gli script sono di solito composti da tanti piccoli "pezzi" uniti tra loro: è necessario che tu prenda un po' di mano nell'unire questi pezzi, altrimenti rischi di eseguire quello che leggi in questo forum ma senza capire realmente come funziona la shell. E non credo sia il tuo obiettivo, no? ;)
Dai, ti aspetto qui non appena hai capito a fondo come funzionano gli script che ti ho postato in questo thread.
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
20/05/2010 20.18
Function Elenco-Partizioni {
param($fun, $Elenco)
$Elenco1=@(); $Elenco2=@()
$Elenco |
ForEach {
if(& $fun $_) {
$Elenco1+=@($_) } else {$Elenco2+=@($_)
}
}
$Elenco1, $Elenco2
}
$RemovedSID = '<SID_Account_da_eliminare>'
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
Get-ChildItem Elenco-Partizioni\, HKLM:\, HKCR:\, HKU:\, HKCC:\ -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?
GRAZIE
CIAO
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
21/05/2010 6.53
Ehm... No, direi di no. ;)
Questo blocco è indipendente dallo script, lo devi aver lanciato prima per poter utilizzare i relativi drive:
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
Per funzionare su tutti i drive logici e sui principali hive del registry lo script può essere aggiornato così:
$RemovedSID = '<SID_Account_da_eliminare>'
$drives = [Environment]::GetLogicalDrives(), 'HKLM:\', 'HKCR:\', 'HKU:\', 'HKCC:\'
$drives | Get-ChildItem -Recurse -Force |
ForEach-Object {
# ...
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/05/2010 20.07
Quindi, se ho capito bene, e' sufficente salvare in un file RimuovereSID.ps le seguenti istruzioni
ew-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
$RemovedSID = '<SID_Account_da_eliminare>'
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)
}
}
Mi potestri fare vedere come si fa, utilizzando il comando Param , a scrivere RimuovereSID.ps SID-da-eliminare ?
grazie
ciao
balubeto
Membro dal: 08/03/2010
Post inseriti: 202
29/05/2010 10.55
Quindi, e` corretto lo script RimuovereSID.ps ?
GRAZIE
CIAO
PS Essendo uno script un po` delicato, vorrei essere sicuro che non combini guai quando lo eseguo e, se vuoi, potestri farmi vedere come funziona l'istruzione param.
efran.cobisi
Membro dal: 06/10/2007
Post inseriti: 632
31/05/2010 7.35
Ciao!
Sì, in linea di massima lo script mi sembra corretto. Ti consiglio, comunque, di fare qualche test prima in una macchina virtuale, così da verificare personalmente che porti a termine l'attività.
Per quanto riguarda param (per favore la prossima volta apri un nuovo thread), è sufficiente eliminare la dichiarazione della viariabile $RemovedSID ed aggiungere questa semplice riga in testa al tuo script:
param ($RemovedSID)
Così facendo potrai invocare RimuovereSID.ps1 (o come hai chiamato lo script) utilizzando il nuovo parametro. Es:
./RimuovereSID.ps1 -RemovedSID '<SID eliminato>'
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