C'è un'API per impostare un ACL NTFS solo su una particolare cartella senza che scorre verso il basso i permessi?

StackOverflow https://stackoverflow.com/questions/981163

Domanda

Nel mio ambiente, ho diversi progetti che coinvolgono in esecuzione relazioni di audit NTFS ACL e varie attività di pulizia ACL su un certo numero di file server. Ci sono due ragioni principali per cui non riesco a svolgere queste attività a livello locale sui server:

1) Non ho accesso locale ai server in quanto sono in realtà di proprietà e gestiti da un'altra società.

2) Sono server NAS SNAP che corrono un sistema operativo Linux modificato (chiamati GuardianOS) quindi anche se ho potuto ottenere l'accesso locale, non sono sicuro della disponibilità di strumenti per eseguire le operazioni di cui ho bisogno.

Con quella di mezzo, ho finito per rotolare il mio tool di reporting di controllo ACL che recurse giù il filesystem a partire da un percorso di alto livello specificato e sarebbe sputare fuori un report HTML su tutti i gruppi / utenti ha incontrato su gli ACL oltre a mostrare i cambiamenti nel permessi come scendeva l'albero. Mentre lo sviluppo di questo strumento, ho scoperto che l'overhead di rete era la parte peggiore di fare queste operazioni e dal processo, ho potuto ottenere sostanzialmente maggiore rendimento filettatura multifunzionale.

Comunque, sto ancora bloccato per la ricerca di un buon strumento per eseguire le modifiche ACL e pulizia. Il tuo standard di strumenti di box (cacls, xcacls, Explorer) sembrano essere single-threaded e soffrire significativa riduzione delle prestazioni quando si va attraverso la rete. Ho guardato a rotazione il mio programma di impostazione ACL che è multithreading, ma l'unica API ho familiarità con è la roba NET FileSystemAccessRule e il problema è che se ho impostato le autorizzazioni a una cartella, che vuole automaticamente a "flusso" i permessi giù. Ciò causa un problema perché voglio fare il "fluire" me stesso usando il multi-threading.

Lo so NTFS "permette di" autorizzazioni per essere incoerente ereditato, perché ho visto in cui una cartella / file viene spostato sullo stesso volume tra due cartelle principali con diverse autorizzazioni ereditate e mantiene i vecchi permessi come "ereditato".

Le domande

1) C'è un modo per impostare un ACL che si applica alla cartella corrente e tutti i bambini (il vostro standard "Si applica a file, cartelle e le sottocartelle" ACL), ma non l'hanno scorrere automaticamente verso il basso per gli oggetti figlio? Fondamentalmente, io voglio essere in grado di dire di Windows che "Sì, questo ACL deve essere applicato agli oggetti figlio, ma per ora, è sufficiente impostare direttamente su questo oggetto".

Giusto per essere cristallino, so sulle opzioni ACL per l'applicazione a "solo questa cartella", ma poi ho perso l'eredità che è un requisito in modo che l'opzione non è valida per il mio caso d'uso.

2) Qualcuno sa di eventuali buoni algoritmi o metodologie per l'esecuzione di modifiche ACL in modo multithread? La mia sensazione è che ogni attraversamento ricorsivo del filesystem dovrebbe funzionare in teoria, soprattutto se si sta solo definendo un nuovo ACL su una cartella di primo livello e vogliono solo "ripulire" tutte le sottocartelle. Faresti imprime la nuova ACL sul primo livello e poi verso il basso ricorsione rimozione di qualsiasi ACE esplicite e poi "scorre" le autorizzazioni ereditate verso il basso.

(FYI, questa domanda è parzialmente duplicato da ServerFault dal momento che è in realtà sia un amministratore di sistema e di un problema di programmazione. D'altra domanda, mi è stato chiesto se qualcuno sa di eventuali strumenti che possono fare impostazione ACL veloce attraverso la rete.)

È stato utile?

Soluzione

Trovato la risposta in un MS KB articolo :

  

I permessi dei file che sono impostati sul file   e cartelle utilizzando Active Directory   Services Interface (ADSI) e ADSI   risorsa utility kit, ADsSecurity.DLL,   non si propagano automaticamente   la sottostruttura alle cartelle esistenti   e file.

     

Il motivo per cui non è possibile utilizzare ADSI per   impostare ACE per propagare fino agli attuali   file e cartelle è perché   ADsSecurity.dll utilizza il basso livello   funzione SetFileSecurity per impostare la   descrittore di protezione su una cartella. Là   è nessuna bandiera che può essere impostato utilizzando   SetFileSecurity automaticamente   propagare le voci di controllo fino a esistente   file e cartelle. Il   flag di controllo SE_DACL_AUTO_INHERIT_REQ   imposterà solo il   Bandiera SE_DACL_AUTO_INHERITED nel   descrittore di protezione associato   con la cartella.

Così ho avuto modo di utilizzare la funzione API Win32 SetFileSecurity a basso livello (che è segnato obsoleta nella sua MSDN ) per impostare l'ACL e che dovrebbe tenerlo da che scorre automaticamente.

Naturalmente, preferirei strappare i miei occhi con un cucchiaio, piuttosto che affrontare cercando di P / Invoke qualche eredità API Win32 con tutte le sue verruche così che io possa finire solo con un vecchio strumento chiamato NT4 FILEACL che è come CACLS, ma ha la possibilità di utilizzare l'API SetFileSecurity così i cambiamenti non si propagano automaticamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top