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 :

ne contient pas de méthode nommée « op_Addition » [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 61
    Points
    61
    Par défaut ne contient pas de méthode nommée « op_Addition »
    Bonjour

    Je suis débutant sur powershell et je ne comprend pas ce qui ce passe.

    J'ai écris le code ci-dessous que j’exécute en mode débug, la pas d'erreur.
    Par contre quand j’exécute normalement mon script j'ai le message d'erreur suivant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Échec lors de l’appel de la méthode, car [System.Management.Automation.PSObject] ne contient pas de méthode nommée «*op_Addition*».
    Au caractère C:\Users\...\Desktop\AccessRights.ps1:66 : 17
    +                 $tabACL+=fAddTab -strDirectory $strFolder -strMemberName $objADO ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation : (op_Addition:String) [], RuntimeException
        + FullyQualifiedErrorId : MethodNotFound
    Mon script qui sert à affiché les droits d’accès a partir d'un dossier racine.
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    #Import ActiveDirectory Module if not loaded
    $Module = Get-Module ActiveDIrectory
    If ($Module -eq $Null) {Import-Module ActiveDirectory}
    
    $DEBUG = 0
    
    #Chemin racine à analyser
    $strPATH = "D:\DATA"
    
    $tabACL=@() #Initialisation du tableau à vide
    
    Function fAD_Name(){
    	Param ([string]$strAccountName)
    	
    	if ($strAccountName.Contains("\")){
    		#Retourne uniquement le sAMAccountName
    		return [String]$strAccountName = ($strAccountName.Split("\")[-1]).Trim()
        } Else {
            return $strAccountName.Trim()
    	}
    }
    
    Function fAddTab(){
        Param([String]$strDirectory,[String]$strMemberName,[String]$strMemberOf='',[String]$strFSRights)
        
        $Dico=New-Object PSObject
    	$Dico | Add-Member -Name Directory -MemberType NoteProperty -Value $strDirectory
        $Dico | Add-Member -Name MemberName -MemberType NoteProperty -Value $strMemberName
        $Dico | Add-Member -Name MemberOf -MemberType NoteProperty -Value $strMemberOf
    	$Dico | Add-Member -Name FileSystemRights -MemberType NoteProperty -Value $strFSRights
        Return $Dico
    }
    
    Function fAD_AddMembers(){
        Param (
            [String]$strCNObjectAD,
            [String]$strFolder,
            [String]$strFSR,
            [String]$strSubCNObjectAD=''
        )
        
        $strCNObjectAD = $strCNObjectAD.Trim()
    
        if($DEBUG -eq 1){Write-Host "strCNObjectAD : $strCNObjectAD"}
    
    	#Récupureation de l'objet Active Directory (User ou Group)
        $objADObject = Get-ADObject -LDAPFilter "(sAMAccountName=$strCNObjectAD)" -properties Name, ObjectClass, Member
    
        if($DEBUG -eq 1){Write-Host '$objADObject.Name :' $objADObject.Name '$objADObject.Class :' $objADObject.ObjectClass}
    
        if([String]$objADObject.ObjectClass -like "group"){
            #Pour Chaque membre du  groupe
    		ForEach ($Member in $objADObject.member){
                
                $objADO = Get-ADObject -LDAPFilter "(distinguishedName=$Member)" -properties cn, ObjectClass
    
                #Si dans les membres ont trouve un autre groupe, alors ont rappel la fonction
    			if ($objADO.ObjectClass -like 'group') {
                    
    				fAD_AddMembers -strCNObjectAD $objADO.cn -strFolder $strFolder -strFSR $strFSR -strSubCNObjectAD $strCNObjectAD
    				
                }Else{
    
                    if($DEBUG -eq 1){Write-Host fAddTab -strDirectory $strFolder -strMemberName $objADO.cn -strMemberOf $strCNObjectAD -strFSRights $strFSR}
    
                    $tabACL+=fAddTab -strDirectory $strFolder -strMemberName $objADO.cn -strMemberOf $strCNObjectAD -strFSRights $strFSR
    				
                }
            }
        }Else{
    		
            if($DEBUG -eq 1){Write-Host fAddTab -strDirectory $strFolder -strMemberName $objADObject.Name -strFSRights $strFSR}
    
    		$tabACL+=fAddTab -strDirectory $strFolder -strMemberName $objADObject.Name -strFSRights $strFSR
    
            if($DEBUG -eq 1){$tabACL}
        }
    }
    
    $liste_repertoire = Get-childitem $strPATH -recurse
    
    foreach ($repertoire in $liste_repertoire){
        if($repertoire.Attributes -eq "Directory"){
            
            if($DEBUG -eq 1){Write-Host "REPERTOIRE : " $repertoire.FullName}
    
            $global_acl = Get-Acl $repertoire.FullName
    
            foreach ($droit in $global_acl.Access){
                
                $strIdentification = fAD_Name $droit.IdentityReference
    
                if($DEBUG -eq 1){Write-Host "IdentityReference " $droit.IdentityReference}
                if($DEBUG -eq 1){Write-Host "strIdentification : $strIdentification"}
    
                fAD_AddMembers -strCNObjectAD $strIdentification.trim() -strFolder $repertoire.FullName -strFSR $droit.FileSystemRights
    		}
        }
    }
    
    return $tabACL

  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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    a priori ton code affecte un autre type à ta variable.
    Ceci reproduit ton erreur:
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $tabACL=new-object pscustomObject
    $tabACL +=fAddTab -strDirectory $strFolder -strMemberName $objADObject.Name -strFSRights $strFSR
    En passant ceci est redondant :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Function fAD_AddMembers(){
      Param (
     
    #La clause Param suffit
    Function fAD_AddMembers{
        Param (
    Ensuite où est le bug...
    Utilise des assertions pour vérifier ton code

  3. #3
    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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    C'est un problème de portée de ta variable $tabACL.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 61
    Points
    61
    Par défaut
    Bonjour et merci

    j'ai donc déclaré mon tableau comme indiquer en début de script (problème persistant).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    #Initialisation du tableau
    $tabACL=new-object pscustomObject
    $tabACL=@()
    
    Function fAD_Name{
    ...
    Pour la porté de la variable j'y es pensé mais j'ai du mal a comprendre.
    Par défaut, elle est local donc accessible aux processus enfant et dans mon cas à tous le script???

    Je vais étudier le document fourni que je crois avoir déjà lu.

  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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par borislotte Voir le message
    Je vais étudier le document fourni que je crois avoir déjà lu.
    Oui c'est le mieux je pense, c'est surtout de pratiquer autour de cette notion qui est important. Lire est ici insuffisant.
    L'heure tardive à laquelle je t'ai répondu m'a tout de même demandé un peu de réflexion, il n'y a rien donc d'évident à débusquer ce type de bug.

    J'utilise rarement la notion de portée dans mon code car elle restreint la réutilisation, et je ne t'ai pas donné la solution (qui est très simple) car à mon avis il vaut mieux que tu comprennes ce qui se passe.
    Pour terminer je te conseille de ne pas utiliser la notation hongroise et d'utiliser la convention Powershell Verb-Noun. Pour ce dernier point ton code en l'état ne pourrait être inséré dans un module.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 61
    Points
    61
    Par défaut
    Merci de l'aide

    J’étudie et ferai un retour.

    et puis j'aurai certainement besoin éclaircissement sur cette phrase :
    Pour ce dernier point ton code en l'état ne pourrait être inséré dans un module.
    Merci encore

  7. #7
    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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par borislotte Voir le message
    et puis j'aurai certainement besoin éclaircissement sur cette phrase :
    Désolé, c'est une erreur.
    Si on utilise un nom de fonction qui respecte la convention Powershell Verb-Noun mais qui ne contient pas un verbe approuvé (ici 'fAD-Name') , l'import du module provoque l'affichage d'un warning :
    Exemple :
    Code Powershell : 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
     
    md C:\Temp\Module\Test
    $env:PSModulePath +=';C:\Temp\Module'
    @'
     Function fAD_Name{param() 'test'}
     Function fAD-Name{param() 'test'}
    '@ > C:\Temp\Module\Test\Test.psm1
     
    import-module Test  -verbose -force
    # COMMENTAIRES : Chargement du module à partir du chemin « C:\Temp\Module\Test\Test.psm1 ».
    # COMMENTAIRES : Exportation de la fonction « fAD_Name ».
    # COMMENTAIRES : Exportation de la fonction « fAD-Name ».
    # AVERTISSEMENT : Les noms de certaines commandes importées du module « Test » contiennent des verbes non approuvés qui
    # peuvent les rendre moins détectables. Pour trouver les commandes comportant des verbes non approuvés, réexécutez la
    # commande Import-Module avec le paramètre Verbose. Pour obtenir la liste des verbes approuvés, tapez Get-Verb.
     
     
    # COMMENTAIRES : La commande « fAD-Name » dans le module « Test » a été importée, mais étant donné que son nom ne
    # contient pas de verbe approuvé, il se peut qu'elle soit difficile à trouver. Pour obtenir la liste des verbes
    # approuvés, tapez Get-Verb.
     
     
    # COMMENTAIRES : Importation de la fonction « fAD-Name ».
    # COMMENTAIRES : Importation de la fonction « fAD_Name
    Et si on utilise un nom de fonction qui ne respecte pas la convention Powershell Verb-Noun (ici 'fADName') l'import d'un module ne provoque pas de warnings.
    Le nom de fonction "fAD_Name" ne respecte pas la convention, mais ça ne gêne pas Powershell.
    Un oubli de ma part...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 61
    Points
    61
    Par défaut
    J'ai modifier mon code et peut maintenant savoir qui à accès a une arborescence de dossier.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    #Import ActiveDirectory Module if not loaded
    $Module = Get-Module ActiveDIrectory
    If ($Module -eq $Null) {Import-Module ActiveDirectory}
    
    #Chemin racine à analyser
    $strPATH = "D:\DATA"
    
    #Initialisation du tableau
    #$tabACL=new-object pscustomObject
    $tabACL=@()
    
    Function fAD_Name{
    	Param ([string]$strAccountName)
    	
    	if ($strAccountName.Contains("\")){
    		#Retourne uniquement le sAMAccountName
    		return [String]$strAccountName = ($strAccountName.Split("\")[-1]).Trim()
        } Else {
            return $strAccountName.Trim()
    	}
    }
    
    Function fAddTab(){
        Param([String]$strDirectory,[String]$strMemberName,[String]$strMemberOf='',[String]$strFSRights)
        
        $Dico=New-Object PSObject
    	$Dico | Add-Member -Name Directory -MemberType NoteProperty -Value $strDirectory
        $Dico | Add-Member -Name MemberName -MemberType NoteProperty -Value $strMemberName
        $Dico | Add-Member -Name MemberOf -MemberType NoteProperty -Value $strMemberOf
    	$Dico | Add-Member -Name FileSystemRights -MemberType NoteProperty -Value $strFSRights
        Return $Dico
    }
    
    Function fAD_AddMembers(){
        Param (
            [String]$strCNObjectAD,
            [String]$strFolder,
            [String]$strFSR,
            [String]$strSubCNObjectAD=''
        )
        
        $strCNObjectAD = $strCNObjectAD.Trim()
    
    	#Récupureation de l'objet Active Directory (User ou Group)
        $objADObject = Get-ADObject -LDAPFilter "(sAMAccountName=$strCNObjectAD)" -properties Name, ObjectClass, Member
    
        if([String]$objADObject.ObjectClass -like "group"){
            #Pour Chaque membre du  groupe
    		ForEach ($Member in $objADObject.member){
                
                $objADO = Get-ADObject -LDAPFilter "(distinguishedName=$Member)" -properties cn, ObjectClass
    
                #Si dans les membres ont trouve un autre groupe, alors ont rappel la fonction
    			if ($objADO.ObjectClass -like 'group') {
                    
    				fAD_AddMembers -strCNObjectAD $objADO.cn -strFolder $strFolder -strFSR $strFSR -strSubCNObjectAD $strCNObjectAD
    				
                }Else{
    
                    $script:tabACL+=fAddTab -strDirectory $strFolder -strMemberName $objADO.cn -strMemberOf $strCNObjectAD -strFSRights $strFSR
    				
                }
            }
        }Else{
    		
    		$script:tabACL+=fAddTab -strDirectory $strFolder -strMemberName $objADObject.Name -strFSRights $strFSR
    
        }
    }
    
    $liste_repertoire = Get-childitem $strPATH -recurse
    
    foreach ($repertoire in $liste_repertoire){
        if($repertoire.Attributes -eq "Directory"){
            
            $global_acl = Get-Acl $repertoire.FullName
    
            foreach ($droit in $global_acl.Access){
                
                $strIdentification = fAD_Name $droit.IdentityReference
                fAD_AddMembers -strCNObjectAD $strIdentification.trim() -strFolder $repertoire.FullName -strFSR $droit.FileSystemRights
    		}
        }
    }
    
    return $tabACL
    Il me reste à gérer les arguments pour indiquer le chemin et si je faire de la récursivité quand j'appelle mon script.


    Merci encore beaucoup de ton aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [python 2.7] - import os ne contient pas la méthode mkfifo
    Par spidetra dans le forum Général Python
    Réponses: 5
    Dernier message: 18/11/2014, 18h41
  2. Problème La méthode nommée n'existe pas.
    Par superxou dans le forum ActionScript 1 & ActionScript 2
    Réponses: 7
    Dernier message: 09/06/2008, 23h43
  3. [JNI] Java ne trouve pas mes méthodes natives
    Par carotte31 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 14/06/2006, 22h47
  4. Réponses: 2
    Dernier message: 07/09/2005, 10h55
  5. Réponses: 19
    Dernier message: 26/05/2005, 10h26

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