IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

[Exchange] Automatiser la création d'une boîte aux lettres


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de PatStan17
    Homme Profil pro
    Chef de projet / Développeur
    Inscrit en
    Décembre 2008
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2008
    Messages : 307
    Par défaut [Exchange] Automatiser la création d'une boîte aux lettres
    Je vois que vous êtes le spécialiste PowerShell donc c'est vers vous que je me tourne.
    Je suis en train de réaliser un site Intranet en ASP.NET/C# pour mon entreprise.
    Je crée mes utilisateurs AD à partir d’un module du site destiné au service GRH .
    Cela se déroule dans la foulée de l’enregistrement du dossier salarié. Jusque là pas de problème je maîtrise. Dans le même ordre d’idée je voudrai automatisé la création de la boite aux lettres de la personne. Malgré mais recherches je n’ai pas trouvé comment faire cela en c#. Il semble que la seule solution est de passer par l’appel d’un script Powershell.
    En cherchant à droite et à gauche j’ai trouvé comment créer une fonction C# qui exécute du script powershell. Cela semble marcher, en voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    public string ExecuterUnScript(string TexteDuScript)
    {
        //Creation Espace Powershell
     
        Runspace Espace = RunspaceFactory.CreateRunspace();
     
        //Ouverture
     
       Espace.Open();
     
        // Cration pipeline et envois du script
        Pipeline UnPipeLine = Espace.CreatePipeline();
        UnPipeLine.Commands.AddScript(TexteDuScript);
     
        UnPipeLine.Commands.Add("Out-String");
     
        //Execute le script
        Collection <PSObject> Resultats = UnPipeLine.Invoke();
     
     
        //Ferme l'Espace PowerShell
        Espace.Close();
     
        //Conversion du resultat en string
        StringBuilder stringBuilder = new StringBuilder();
     
        foreach (PSObject obj in Resultats)
        {
            stringBuilder.AppendLine(obj.ToString());
        }
     
        UnPipeLine.Dispose();
        Espace.Dispose();
     
        return stringBuilder.ToString();
    }
    toujours grace a mes recherches j'ai ensuite pondu une fonction pour construire un script powershell qui crée une boîte aux lettre pour un compte AD et le passe ensuite à ma première fonction pour exécution :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     public string CreationBoîteAuxLettresExchange(string Nom, string Prenom, string UserAD, string MotDePasseUserAD, string BaseDeDonneesExchange, string Domaine, string Administrateur, string MotDePasseAdministrateur, string ControleurDeDomaine)
        {
            //BASE EXCHANGE = Mailbox Database 0113932642
            string NomAffiche = Nom + " " + Prenom;
            string Alias = Prenom + " " + Nom;
            string AdresseEmail = Prenom + "." + Nom + "@" + Domaine;
            string CompteAD  = Domaine + "\\" + UserAD;
            string CompteAdmin  = Domaine + "\\" + Administrateur;
     
            string Script = "New-Mailbox -Database " + BaseDeDonneesExchange + " -Name " + NomAffiche + " -LinkedDomainController " + ControleurDeDomaine + " -LinkedMasterAccount " + CompteAD + " -OrganizationalUnit Users -UserPrincipalName" + AdresseEmail + "-LinkedCredential (Get-Credential " + CompteAdmin + ")";
            return ExecuterUnScript(Script);
        }

    Voici ma configuration serveurs


    Un serveur web sur lequel se trouve ce code : SRV-WEB
    Un contrôleur de domaine : SRV-01
    mon serveur de messagerie : SRV-EXCHANGE (version 2010)


    Dans l'etat actuel des choses cela ne marche pas car selon ce que je comprend mon script s'execute en local sur le serveur web alors qu'il devrait s'executer sur mon serveur Excahnge ... je ne sais même pas si il est correct ...


    j'en appelle donc à votre expertise pour me dire en premier lieux si je m'y prend bien pour faire ce que je veux faire et pour que vous me donniez des pistes de travail et de recherches vers la bonne solution ...si vous en voyez une ....


    Merci d'avance ....


    P.JEAN

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Citation Envoyé par PatStan17 Voir le message
    j'en appelle donc à votre expertise
    Ah zut je ne connais pas Exchange! ça commence bien

    Sinon la trame du code C#, ormis une gestion d'erreur, me semble correcte.
    Il est tout de même préférable dans ce contexte , enfin vue de ma fenêtre,et dans un premier temps, de simplifier l'automatisation en utilisant uniquement une console PowerShell. Savoir si l'objectif est réalisable et répondre à la question :
    Citation Envoyé par PatStan17 Voir le message
    je ne sais même pas si il est correct ...
    Ensuite vérifier dans l'aide en ligne ou sur technet si le cmdlet permet d'adresser un serveur distant via un paramètre. voir aussi celui-ci (?)
    Sinon essayer ceci basé sur le concept d'implicit remoting sessions. Reste à l'implémenter côté infra...

    Et concernant ceci :
    Citation Envoyé par PatStan17 Voir le message
    Il semble que la seule solution est de passer par l’appel d’un script Powershell.
    PowerShell étant surtout un framework dotnet, il est donc accessible en langage compilé, et tous les cmdlets proposés par les nouveaux produits MS sont, je pense, accessible sans passer par un script PS. Par contre c'est plus verbeux en C#, mais moins qu'en assembleur

  3. #3
    Membre éclairé Avatar de PatStan17
    Homme Profil pro
    Chef de projet / Développeur
    Inscrit en
    Décembre 2008
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2008
    Messages : 307
    Par défaut C'est bon ....
    C'est bien ce que je disais ....c'est vous l'Expert ...Gràce à vos conseils et infos j'ai trouvé ....Voici ce que je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $MotDePasse = ConvertTo-SecureString "MotDePasse -asplaintext -force
    $Profil = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "Administrateur",$MotDePasse
    $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri Http://SRV-EXCHANGE/POWERSHELL -Credential $Profil
    Import-PSSession $Session
    Puis je colle derrière le script de création de BAL et hop ça marche ...

    Merci beaucoup ...


    P.JEAN

  4. #4
    Membre éclairé Avatar de PatStan17
    Homme Profil pro
    Chef de projet / Développeur
    Inscrit en
    Décembre 2008
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2008
    Messages : 307
    Par défaut Hello
    Depuis hier cette rerreur se produit sur mon serveur web :

    Une exception a été levée par l'initialiseur de type pour 'System.Management.Automation.Internal.PSETWTracerFactory'.

    elle se produit quand je lance cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    public string ExecuterUnScriptSurLeServeurExchange(string ScriptPowerShellAExecuter)
    {
    
        string Script = string.Empty;
        Script = "$MotDePasse = convertto-securestring \"" + LesParametres.MotDePasseAdministrateur + "\" -asplaintext -force";
       // Script = "$MotDePasse = ConvertTo-SecureString '" + LesParametres.MotDePasseAdministrateur + "' -asplaintext -force";
        Script = Script + "\r $Profil = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList " + LesParametres.LoginAdministrateur + ",$MotDePasse";
        Script = Script + "\r $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri Http://" + LesParametres.NomDuServeurExchange + "/POWERSHELL -Credential $Profil";
        Script = Script + "\r Import-PSSession $Session ";
    
        Script = Script + "\r" + ScriptPowerShellAExecuter;
    
       //Creation Espace PowerShell sur le serveur WEB
        Runspace Espace = RunspaceFactory.CreateRunspace();
    
        //Ouverture
        Espace.Open();
    
        //Creation Pipeline et envois du script
        Pipeline UnPipeline = Espace.CreatePipeline();
        UnPipeline.Commands.AddScript(Script);
    
    
        UnPipeline.Commands.Add("Out-String");
        UnPipeline.Invoke();
       
    
        //Fermeture
        Espace.Close();
    
       
        //Fermeture & Nettoyage
        Espace.Close();
        //Resultats.Clear();
    
        UnPipeline.Dispose();
        Espace.Dispose();
    
        return "OK";
    }
    ELLE SE PRODUIT SUR LA LIGNE : UnPipeline.Invoke();

    je ne comprend pas, malgré mes recherches je ne trouve pas d'explication ...pouvez vous m'aider ?

    Merci

    PAT

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    A priori il s'agit d'un pb autour de ETW tracing, un listener manquant ?
    La config a peut être été modifiée manuellement ou suite à l'installation d'un un patch ou ???
    Difficile de t'aider sur ce type d'erreur, à moins de tracer la pile d'appel, utilise Resolve-Error dispo sur le blog de l'équipe PS.

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/04/2012, 09h35
  2. [Exchange 2003] Taille des éléments d'une boîte aux lettres.
    Par Richard_35 dans le forum Exchange Server
    Réponses: 0
    Dernier message: 20/10/2010, 11h59
  3. Droit d'accés sur une boîte aux lettres exchange
    Par samtgr dans le forum Exchange Server
    Réponses: 1
    Dernier message: 15/05/2008, 15h39
  4. Réponses: 1
    Dernier message: 24/08/2007, 20h32
  5. Réponses: 1
    Dernier message: 24/07/2007, 11h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo