none
Problème sur manipulation du groupe local "Administrateurs" RRS feed

  • Question

  • Bonjour,

    Je me demande si cela est faisable dans ma situation, je m'explique. Dans mon entreprise, nous masterisons les postes via une image indépendante de la machine, via une application maison on installe les pilotes et dans le même temps personnalise le nom de la machine. [Je tente de faire un programme qui automatise la suite]. Ensuite, nous faisons une mise sur le domaine [Ok], redémarrage du PC, modification des droits sur le fichier C:\Windows\SapLogon.ini [Ok], et dernier point il me reste à ajouter un groupe de l'AD dans le groupe local Administrateurs et là cela coince.

    Dans cette dernière phase je suis administrateur local de la machine, lorsque je vais ajouter le groupe je dois entrer mon compte adminitrateur réseau. Je pense que c'est là que cela se joue. Quand je lance la fonction en Administrateur local, j'obtiens directement un accès refusé. si je génére l'éxecutable et tente un "éxecuter en tant que ..." j'obtiens le message : "Windows ne parvient pas à accéder au périphérique, au chemin d'accès, ou au fichier spécifié. Vous ne disposez peut-être pas des autorisations ...". JE suppose que cela vient du fait que je ne dispose pas de compte Adminitrateur Local + Réseau.

    Est-il possible de contourner cela ? Dois-je m'orienter sur la création d'un second éxecutable et de le lancer du premier via Process.Start("Second.exe", username, password, domaine) ? (Je n'aime pas trop l'idée).

    Je mets le code que j'utilise poura jouter le groupe AD vers le groupe Administrateurs Local :

            Try
                Dim PC As String = Environ("ComputerName")
                Dim LCL As New DirectoryEntry("WinNT://" & PC & ",computer")
                Dim DOM As New DirectoryEntry("WinNT://" & TBDomaine)
                Dim DOMGRP As DirectoryEntry = DOM.Children.Find("GG-ComputersLocalAdmin", "group")
                Dim LCLGRP As DirectoryEntry = LCL.Children.Find("Administrateurs", "group")
                LCLGRP.Invoke("Add", New Object() {LCLGRP.Path.ToString})
                MessageBox.Show("Modification du groupe Administrateurs Local réussie !", "Opération réussie", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
                End
            End Try
    
    

    Merci, cordialement,

    Cyril

    mardi 27 septembre 2011 12:44

Réponses

  • Bonjour Cyril,

    On dirais que vous posez les même questions que moi il y a un bon moment de ça :) (On est peut être collègue ?)
    J'ai fait déjà toute cette partie d'automatisme avec Windows XP et Windows 7

    Le code ci dessous fonctionne normalement sous Windows XP et 7

     

            '
            ' Ajoute l'utilisateur (AD) dans le group Administrateurs
            '
            Dim de As New DirectoryEntry("LDAP:xxxxxxxxxxxx")
            Dim deSearch As New DirectorySearcher() With {.SearchRoot = de, .Filter = "cn=xtalour"}
    
            Dim group As New DirectoryEntry("WinNT://" & oComputerName & "/Administrateurs")
            Dim Members As Object = group.Invoke("Members", Nothing)
            Dim ExistLocal = False
    
            For Each Member As Object In CType(Members, IEnumerable)
    
                Dim x As New DirectoryEntry(Member)
                If x.Name.ToLower = deSearch.FindOne.GetDirectoryEntry.Properties("cn").Value.ToString.ToLower Then
                    ExistLocal = True
                    Exit For
                End If
            Next
    
            If ExistLocal = False Then
                group.Invoke("Add", New Object() {"WinNT://" & de.Properties("dc").Value & "/" & deSearch.FindOne.GetDirectoryEntry.Properties("cn").Value})
            Else
                Console.WriteLine("Le compte exite deja")
            End If
    

    faire attention au groupe Administrateurs en anglais c'est administrators

     

    Je detaille pas trop c'est volontaire, faite moi savoir si vous avez un problème ...

     

    A bientôt


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn

    mardi 27 septembre 2011 13:33
    Auteur de réponse
  • Merci de donner des nouvelles.

    J'ai vu sur certain site ou il rencontrait le même problème que vous et aprioris ils n'ont pas trouver de solution.

    Dans le cas ou cela ne fonctionnerais toujours pas je vous donne une solution de contournement (un article de : Alex Petrescu)
    Comment modifier les I/O standard d’un processus

    ne n'est pas très propre de procéder ainsi mais des fois on a pas le choix
    Pour récupérer les erreurs éventuelles il faudra utiliser "StandardError"

    A bientôt


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    vendredi 30 septembre 2011 08:02
    Auteur de réponse

Toutes les réponses

  • Bonjour Cyril,

    On dirais que vous posez les même questions que moi il y a un bon moment de ça :) (On est peut être collègue ?)
    J'ai fait déjà toute cette partie d'automatisme avec Windows XP et Windows 7

    Le code ci dessous fonctionne normalement sous Windows XP et 7

     

            '
            ' Ajoute l'utilisateur (AD) dans le group Administrateurs
            '
            Dim de As New DirectoryEntry("LDAP:xxxxxxxxxxxx")
            Dim deSearch As New DirectorySearcher() With {.SearchRoot = de, .Filter = "cn=xtalour"}
    
            Dim group As New DirectoryEntry("WinNT://" & oComputerName & "/Administrateurs")
            Dim Members As Object = group.Invoke("Members", Nothing)
            Dim ExistLocal = False
    
            For Each Member As Object In CType(Members, IEnumerable)
    
                Dim x As New DirectoryEntry(Member)
                If x.Name.ToLower = deSearch.FindOne.GetDirectoryEntry.Properties("cn").Value.ToString.ToLower Then
                    ExistLocal = True
                    Exit For
                End If
            Next
    
            If ExistLocal = False Then
                group.Invoke("Add", New Object() {"WinNT://" & de.Properties("dc").Value & "/" & deSearch.FindOne.GetDirectoryEntry.Properties("cn").Value})
            Else
                Console.WriteLine("Le compte exite deja")
            End If
    

    faire attention au groupe Administrateurs en anglais c'est administrators

     

    Je detaille pas trop c'est volontaire, faite moi savoir si vous avez un problème ...

     

    A bientôt


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn

    mardi 27 septembre 2011 13:33
    Auteur de réponse
  • Merci de te pencher à nouveau sur mon cas.

    Je pense avoir adapter ton code à mon cas, cela génère un message d'erreur : La valeur fournie pour adsObject n'implémente pas les IAD. Je lance le programme en administrateur local. Je teste avec un compte d'utilisateur de l'AD mais mon but est de faire cela avec un groupe de l'AD.

    J'ai remplacé les x par le nom de l'AD, j'ai gardé le "Administrateurs" car je teste sur une machine en Windows 7 Fr.

    Je continuerai mes investigations jeudi car je dois partir en déplacement.
    mardi 27 septembre 2011 14:44
  • Cyril,

    Dans le chemin LDAP qu'avez vous mis ?
    Exemple (cela doit être au format LDAP) LDAP://DOM.DOMM.com/DC=DOM,DC=DOMM,DC=com
    Dans ".Filter = NomDuGroup"

    Pouvez vous me dire sur quelle ligne ça plante ?

     


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    • Proposé comme réponse TroxsaEditor mardi 27 septembre 2011 18:36
    mardi 27 septembre 2011 15:02
    Auteur de réponse
  • Aïe, en effet j'ai du mal avec le format LDAP :), j'avais juste mis LDAP://LeDomaine.dom.com.

    Dans .Filter j'ai mis mon nom d'utilisateur, je comptais tester avec un User avant de voir (modifier ?) la syntaxe pour un Group.

    Je corrigerai l'erreur LDAP quand je reviendrai jeudi, je vous dirai sur quelle ligne cela plante si le problème n'est pas corrigé par cette modification.

    Par contre, l'application fonctionnera t-elle en administrateur local ou dois-je faire un "Exécuter en tant que ... Admin_Domaine" ?
    mardi 27 septembre 2011 18:15
  •  

    Dans le Filter vous pouvez mettre ce que vous voulez, c'est a dire un User ou un Group cela fonctionne de la même façon

    Faire aussi attention a :

    ("WinNT://" & oComputerName & "/Administrateurs")

    Vous pouvez le remplacé par :

    ("WinNT://./Administrateurs")

    Ce code fonctionne avec le compte ayant droit localement, c'est a dire que le programme devra être obligatoirement exécuté en Administrateur, si le programme est lancé a partir d'une session User (utilisateur) cela ne fonctionne donc pas.
    Puis d'apres ce que je comprend vous avez une structure AD (LDAP) en lecture pour "tout le monde" (everyone) en interne, cela ne devrai donc pas gêné le fonctionnement du programme. sauf dans le cas contraire il faudra mettre un compte LDAP qui autorise la lecture.

    Et pour répondre a la question si il faut que ce programme soit exécuté en Domain Admin : Oui, il peux aussi être exécuté du moment que la machine soit dans le domaine et que le groupe Domain Admin soit dans le groupe Administrateurs

    Je suis confiant pour Jeudi, ça fonctionnera :)

    Sachez que la ligne ou cela plante ne veux pas forcement dire que l'erreur vient de là.

    A Jeudi

    A bientôt


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    mardi 27 septembre 2011 18:36
    Auteur de réponse
  • Bonjour, Cyril,

    Est-ce que vous avez résolu votre problème en utilisant les informations fournies par Xavier ? Merci de tenir la communauté informée sur la suite de vos démarches.

     

    Cordialement,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    jeudi 29 septembre 2011 06:20
  • Bonjour,

    Voilà j'ai apporté les modifications : correction du LDAP

    J'ai tenté avec les deux syntaxes :

    - ("WinNT://./Administrateurs")

    - ("WinNT://" & oComputerName & "/Administrateurs")

    Même message d'erreur "La valeur fournie pour adsObject n'implémente pas les IAD", l'erreur se produit sur la ligne :

    Dim x As New DirectoryEntry(members)

    Voilà tout, merci.

    jeudi 29 septembre 2011 08:03
  • Bonjour Cyril,

    La ligne que vous indiquez ce trouve dans une boucle For Each et jai l'impression que vous vous etes trompé de variable
    ce n'est pas Members mais Member

     

    Pouvez vous essayer a nouveau et me donner le résultat ?


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    jeudi 29 septembre 2011 09:07
    Auteur de réponse
  • En effet, j'aurai du changer complètement le nom je ne trouve pas pratique Member et members, c'est confus pour moi.

    Maintenant j'ai une "Erreur inconnue (0x80005000)" sur la ligne suivante (If x.Name.ToLower ...).

    J'ai tenté en tant qu'administrateur local et domaine (en ayant ajouter l'administrateur domaine dans le groupe administrateurs local).

    Edition : En fait, en faisant l’exécution en pas à pas, je constate que sur la variable "de" j'ai déjà l'erreur mentionnée plus haut, sans que cela n'empêche le programme de continuer du moins jusqu'à la ligne "If x.Name...."
    • Modifié Cesame jeudi 29 septembre 2011 09:28 Ajout information sur l'erreur
    jeudi 29 septembre 2011 09:21
  • Je ne comprend pas pourquoi il y a cette erreur sur :

     If x.Name.ToLower = deSearch.FindOne.GetDirectoryEntry.Properties("cn").Value.ToString.ToLower Then

    Pouvez m'envoyer, par mail (voir ci-dessous), juste la partie qui plante avec les paramètre que vous mis.

    A bientôt


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn

    jeudi 29 septembre 2011 09:29
    Auteur de réponse
  • Désoler pour la communauté de ne pas partager certaine informations (données confidentielles sur les paramètres LDAP)

    Après avoir reçu me mail:

    Certainement du a une erreur de copier coller et de modification de ma part. Le chemin LDAP  que Cyril a mis dans son code etait :
    LDAP:DOM.DOMM.com/DC=DOM,DC=DOMM,DC=com

    - Il manquait les "//" apres "LDAP:" cela donne :

    LDAP://DOM.DOMM.com/DC=DOM,DC=DOMM,DC=com

     

    Mais cela n'a pas résolut le problème


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn

    jeudi 29 septembre 2011 10:15
    Auteur de réponse
  • Cyril,

    Avez vous le necessaire suite au mail que je vous ai envoyé ?

    J'ai vu sur ce site http://www.vbforums.com/showthread.php?t=489138
    Il faudra changé le nom Administrators par Administrateurs et User1000 par le nom du groupe ou l'utilisateur.

    Il faudra certainement ajouté l'utilisateur de facon LDAP

    de.Properties("dc").Value & "/" & deSearch.FindOne.GetDirectoryEntry.Properties("cn").Value

    Pourriez vous faire le test

     


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn

    • Modifié TroxsaEditor jeudi 29 septembre 2011 14:17 correction
    jeudi 29 septembre 2011 14:17
    Auteur de réponse
  • Bonjour Xavier,

    Vraiment désolé de tarder à répondre, je suis très pris depuis hier après-midi, du matériel qui tombent en panne en fin de mois on me harcèle de toutes parts. Je continue de tester dès que j'ai du temps. Je vous ferai un retour dans l'après-midi une fois synthétisé.

    Merci, cordialement,

    Cyril

     

    Edition : Je me demandais, n'est-il pas possible d'ajouter les groupes AD dans le groupe local administrateurs via le SSID ? Indépendamment du réseau.

     


    • Modifié Cesame vendredi 30 septembre 2011 08:00
    vendredi 30 septembre 2011 07:49
  • Merci de donner des nouvelles.

    J'ai vu sur certain site ou il rencontrait le même problème que vous et aprioris ils n'ont pas trouver de solution.

    Dans le cas ou cela ne fonctionnerais toujours pas je vous donne une solution de contournement (un article de : Alex Petrescu)
    Comment modifier les I/O standard d’un processus

    ne n'est pas très propre de procéder ainsi mais des fois on a pas le choix
    Pour récupérer les erreurs éventuelles il faudra utiliser "StandardError"

    A bientôt


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    vendredi 30 septembre 2011 08:02
    Auteur de réponse
  • Cyril,

    Avez vous fini par réussir a faire ce que vous voulez ?
    (vous n'avez peut être pas eu le temps)

    A bientôt

     

     


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    lundi 3 octobre 2011 10:11
    Auteur de réponse
  • Bonjour Xavier,

    Je suis cloué au lit pour quelques jours, je ne peux donc plus tester (si j'avais su j'aurai emporter mon PC du boulot ...). J'ai beau tripatouiller le code (le votre et celui de l'avant dernier lien), rien à faire. Pour le dernier lien, ce doit être d'un trop haut niveau pour moi, je ne comprends pas pourquoi je dois manipuler dans les processus. Le but est-il d'ajouter les groupes en ligne de commande MS-DOS ? Sinon, mon programme est déjà très satisfaisant, je vous remercie du temps consacré et vous souhaite bonne continuation.

    Cordialement,

    Cyril

    • Modifié Cesame mardi 4 octobre 2011 13:26 Mise en page douteuse :)
    mardi 4 octobre 2011 13:26
  • Cyril,

    Oui c'est pour ajouté le groupe via ligne de commande.)
    N’hésitez pas a relancé votre demande pour trouvé une solution (peut être coté WMI ?).

    A bientôt


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn

    mardi 4 octobre 2011 14:22
    Auteur de réponse