2009-02-20 12 views
12

Gli implementatori del cambiamento di produzione per il nostro gruppo IT hanno avuto il compito di esaminare la sicurezza per tutti i vari oggetti nel nostro gruppo, principalmente per assicurarsi che le persone che hanno lasciato il nostro impiego o trasferimento ad altri gruppi non ha più accesso alle condivisioni server, alle directory web, ai database sql, ecc. Di recente abbiamo completato la parte SQL e abbiamo uno script riutilizzabile che può essere eseguito annualmente (oa qualsiasi frequenza arriviamo con). Ha funzionato benissimo e abbiamo revisionato 20 database su circa 10 server con pochi minuti.Utilizzo di C# per ottenere un elenco di ACL per server e unità mappate

Ora, per il roba del server. Ho un'applicazione che ho scritto in C# usando .NET 2.0 che eseguirà la scansione in modo ricorsivo di un elenco di directory e scaricherà gli ACL in un file di testo. Questo funziona eccellente. Sulla macchina locale. I percorsi UNC e Mapped non funzionano, ricevo il seguente messaggio di eccezione: Il processo non possiede il privilegio "SeSecurityPrivilege" richiesto per questa operazione.

Su questa linea:

DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All); 

Dove di un oggetto DirectoryInfo enumerato da un [] array DirectoryInfo.

Probabilmente non sarà possibile ottenere il privilegio SeSecurityPrivilege. Tuttavia non penso che questo dovrebbe essere necessario. Posso aprire la cartella e fare clic destro per proprietà e fare clic sulla scheda sicurezza e visualizzarla nella GUI. I dovrebbe essere in grado di accedervi anche a livello di programmazione.

Qualche idea su come posso modificare questa sezione di codice per ottenere le autorizzazioni per la cartella di destinazione?

private void CheckSecurity(DirectoryInfo[] DIArray) 
{ 
    foreach (DirectoryInfo di in DIArray) 
    { 
     DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All); 
     string sAccessInfo = string.Empty; 

     foreach (FileSystemAccessRule FSAR in DirSec.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount))) 
     { 
      sAccessInfo += GetAceInformation(FSAR); 
     } 

     if (sAccessInfo != string.Empty) 
     { 
      // Write info to text file 
     } 
    } 
} 

private string GetAceInformation(FileSystemAccessRule ace) 
{ 
    StringBuilder info = new StringBuilder(); 
    string line = string.Format("Account: {0}", ace.IdentityReference.Value); 
    info.AppendLine(line); 
    line = string.Format("Type: {0}", ace.AccessControlType); 
    info.AppendLine(line); 
    line = string.Format("Rights: {0}", ace.FileSystemRights); 
    info.AppendLine(line); 
    line = string.Format("Inherited ACE: {0}", ace.IsInherited); 
    info.AppendLine(line); 
    return info.ToString(); 
} 

Edit: Come faccio a controllare la cartella remota per l'attrib lettura nella LCA quando non riesce a ottenere il metodo del "GetAccessControl()" per la cartella principale? (Se passo in \ server \ percorso, ha errori nel recuperare le informazioni per \ server \ percorso).

L'account utente è un account di dominio e dispongo delle autorizzazioni per leggere la struttura del file. Posso visualizzare la sicurezza dalle proprietà della cartella/dei file.

Verificherò il monitor di processo ma non sono sicuro che sarà in grado di eseguirlo sul server (non sono un amministratore sui server in questione).

+1

Questo esempio di domanda/codice è stato davvero molto utile. Ho usato questo codice per creare un monitor di autorizzazione file per uno dei nostri sistemi interni. –

risposta

17

Si ottiene l'errore a causa della scheda "Controllo", anche se sono abbastanza sicuro che tutto ciò che si desidera realmente accedere sullo schermo sono i dati nella scheda "Autorizzazioni". SeSecurityPrivilege controlla l'accesso al SACL.

Prova a cambiare

DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All); 

a

DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.Access); 

allora si dovrebbe smettere di ottenere l'errore

+0

Duh! Non so perché non ho esaminato di più queste altre enumerazioni. Ci proverò domani e vedrò quello che otterrò. Grazie! – bdwakefield

+0

Questo ha fatto il trucco, grazie! – bdwakefield

+0

Bene, ero un po 'preoccupato dal momento che non riuscivo a ottenere da solo l'errore ... – uzbones

1

Verificare che la cartella remota conceda all'utente l'esecuzione del codice Leggi attributi nell'ACL.

Ricordare inoltre che le autorizzazioni vengono risolte sui computer remoti (server), pertanto l'appartenenza al gruppo locale (utenti e amministratori) potrebbe non includere l'account utente in esecuzione sul client.

Avere Process Monitor in esecuzione sul server (filtrato per le cartelle/i file in questione) può aiutare a risolvere i dettagli del motivo della mancata riuscita.

+0

Vedere la nota sopra in modifica. – bdwakefield

+0

Hmmm ... senza i diritti di amministratore, sarete in balia delle autorizzazioni dispari e/o troverete il debug molto difficile. – Richard

Problemi correlati