mardi 26 février 2013

Delete Subfolders and Files - Définir des droits précis sur une arborescence grâce à .Net

Afin d'automatiser la création d'une arborescence et de définir précisément les droits pour certains utilisateurs dans un domaine Windows Active Directory, j'ai créé un script en Powershell. Le dossier se trouve sur un serveur de fichiers Windows 2000.

Malheureusement, à l'époque où j'ai créé le script, je n'ai jamais pu trouver comment définir le droit spécifique "Delete Subfolders and Files" tout en supprimant le droit "Delete" et ceci en Powershell v2.


Sous forme graphique, le résultat qu'on aimerait obtenir :


J'ai donc créé un petit second script écrit en .Net et appelé par mon script Powershell afin de réaliser cette opération. Le script écrit en powershell fournit deux arguments au script .net compilé et disponible sous le forme d'un simple exécutable: le username qui doit posséder les droits et le dossier sur lequel définir les permissions.

Voici le code .Net pour réaliser l'opération décrite ci-dessus :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.DirectoryServices;
using System.Security.AccessControl;
using System.IO;


namespace GroupADUploadRights
{
    class Program
    {
        static void Main(string[] args)
        {                 
            try
            {
                String[] Args = Environment.GetCommandLineArgs();
                if (Args.Length != 3)
                {
                    System.Console.WriteLine("Wrong command usage.");
                    System.Console.WriteLine("1 mandatory parameter should be given: ");
                    System.Console.WriteLine("Argument 1 : Username");
                    System.Console.WriteLine("Argument 2 : Directory");

                }
                else
                {                  
                    string userDn = "CN="+Args[1]+",OU=myOU,DC=contoso,DC=com"; string groupDn = "CN=Domain Users,OU=Group,DC=contoso,DC=com";
                    DirectoryEntry dirEntry = new DirectoryEntry("LDAP://" + groupDn);
                    dirEntry.Properties["member"].Remove(userDn);
                    dirEntry.CommitChanges();
                    dirEntry.Close();

                    try
                    {
                        string fileName = "f:\\" + Args[2] + "\\folderToRestrict";
                        // Add the access control entry to the file.
                        AddFileSecurity(fileName, Args[1],
                            FileSystemRights.DeleteSubdirectoriesAndFiles, AccessControlType.Allow);

                        // Remove the access control entry from the file.
                        RemoveFileSecurity(fileName, Args[1],
                            FileSystemRights.Delete, AccessControlType.Allow);                      
                    }
                    catch (Exception e)
                    {
                        //Console.WriteLine(e);
                    }

                }
            }
            catch (System.DirectoryServices.DirectoryServicesCOMException Exc)
            {
                //doSomething with E.Message.ToString();
            }          

        }

        // Adds an ACL entry on the specified file for the specified account.
        public static void AddFileSecurity(string fileName, string account,
            FileSystemRights rights, AccessControlType controlType)
        {

            // Get a FileSecurity object that represents the
            // current security settings.
            FileSecurity fSecurity = File.GetAccessControl(fileName);

            // Add the FileSystemAccessRule to the security settings.
            fSecurity.AddAccessRule(new FileSystemAccessRule(account,
                rights, controlType));

            // Set the new access settings.
            File.SetAccessControl(fileName, fSecurity);

        }

        // Removes an ACL entry on the specified file for the specified account.
        public static void RemoveFileSecurity(string fileName, string account,
            FileSystemRights rights, AccessControlType controlType)
        {

            // Get a FileSecurity object that represents the
            // current security settings.
            FileSecurity fSecurity = File.GetAccessControl(fileName);

            // Remove the FileSystemAccessRule from the security settings.
            fSecurity.RemoveAccessRule(new FileSystemAccessRule(account,
                rights, controlType));

            // Set the new access settings.
            File.SetAccessControl(fileName, fSecurity);

        }
    }
}

Aucun commentaire:

Enregistrer un commentaire