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);

        }
    }
}

samedi 23 février 2013

Larger Cover Exam Ref 70-413: Designing and Implementing a Server Infrastructure

Ça y est !

Je suis officiellement MCSA 2012 :-) J'ai passé la certification 70-417 (J'en avais déjà parlé ici : http://sysadminconcombre.blogspot.be/2013/01/larger-cover-exam-ref-70-417-upgrading.html)


Beaucoup de boulot pour y arriver, mais la certif est dans la poche, on va pouvoir se concentrer sur la suivante : 70-413 Designing and Implementing a Server Infrastructure

En effet, j'ai reçu un voucher de la part de Microsoft me permettant de bénéficier d'un examen gratuit sur les trois (70-417; 70-413; 70-414) me séparant du titre de MCSE Server Infrastructure 2012. Un examen coûtant 150€, c'est bienvenu et surtout bien joué commercialement ;-) En effet, ça pousse à ne pas s'arrêter au titre de MCSA 2012.

Le livre acheté : http://shop.oreilly.com/product/0790145370242.do


Je viens d'en finir la lecture, il est très bien écrit comme d'habitude avec les bouquins de chez Microsoft. Beaucoup de liens sont faits vers des articles très précis de Technet.

On sent bien qu'il va falloir beaucoup bosser la pratique... C'est donc reparti pour de longues soirées à bosser en labo.

dimanche 10 février 2013

Microsoft Surface 8 pro 128 GB : Sold out !

À peine quelques heures après sa sortie sur le store US, la tablette Microsoft Surface 8 Pro 128 GB vendue 999$ est sold out !

Il reste encore des exemplaires de la version possédant 64 GB d'espace de stockage en vente : http://surface.microsoftstore.com/store/msstore/Content/pbpage.Surface_Pro?ESICaching=off


Gagnez une visite du Datacenter Microsoft à Dublin !



Il ne vous reste que quelques jours pour tenter de gagner une des dix visites du Datacenter Microsoft à Dublin. En effet, le concours se termine le 14 février à minuit.

Afin de promouvoir la sortie de son OS serveur 2012, Microsoft offre la visite d'un jour et le voyage (aller-retour) jusqu'à Dublin.

Pour participer, vous devez résider en France Métropolitaine (Corse comprise) et être âgé de 16 ans au moins.


Pour faire partie du tirage au sort, il vous suffit de téléchager Windows server 2012.

Lien : http://technet.microsoft.com/fr-fr/evalcenter/hh670538.aspx

Bonne chance !