none
Mapear Rede usando PowerShell basedo em grupos do AD RRS feed

  • Pergunta

  • Ola Pessoal,

    Tenho o seguinte script Power Shell:


    # ====================================================
    # Queries user account in AD for user group membership
    # ====================================================
    
    $strName = $env:username
    
    function get-GroupMembership($DNName,$cGroup){
        
        $strFilter = "(&(objectCategory=User)(samAccountName=$strName))"
    
        $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
        $objSearcher.Filter = $strFilter
    
        $objPath = $objSearcher.FindOne()
        $objUser = $objPath.GetDirectoryEntry()
        $DN = $objUser.distinguishedName
            
        $strGrpFilter = "(&(objectCategory=group)(name=$cGroup))"
        $objGrpSearcher = New-Object System.DirectoryServices.DirectorySearcher
        $objGrpSearcher.Filter = $strGrpFilter
        
        $objGrpPath = $objGrpSearcher.FindOne()
        
        If (!($objGrpPath -eq $Null)){
            
            $objGrp = $objGrpPath.GetDirectoryEntry()
            
            $grpDN = $objGrp.distinguishedName
            $ADVal = [ADSI]"LDAP://$DN"
        
            if ($ADVal.memberOf.Value -eq $grpDN){
                $returnVal = 1
                return $returnVal = 1
            }else{
                $returnVal = 0
                return $returnVal = 0
        
            }
        
        }else{
                $returnVal = 0
                return $returnVal = 0
        
        }
            
    }
    
    
    Clear-Host
    # Remove todos os Mapeamentos Existentes
    Remove-PSDrive –Name “F”
    Remove-PSDrive –Name “G”
    Remove-PSDrive –Name “H”
    Remove-PSDrive –Name “I”
    Remove-PSDrive –Name “J”
    Remove-PSDrive –Name “K”
    Remove-PSDrive –Name “L”
    Remove-PSDrive –Name “M”
    Remove-PSDrive –Name “N”
    Remove-PSDrive –Name “O”
    Remove-PSDrive –Name “P”
    Remove-PSDrive –Name “Q”
    Remove-PSDrive –Name “R”
    Remove-PSDrive –Name “S”
    Remove-PSDrive –Name “T”
    Remove-PSDrive –Name “V”
    Remove-PSDrive –Name “U”
    Remove-PSDrive –Name “W”
    Remove-PSDrive –Name “X”
    Remove-PSDrive –Name “Y”
    Remove-PSDrive –Name “Z”
    Clear-Host
    
    #Inicia os Mapementos Padrão a Todos os Usuários
    
    New-PSDrive –Name “F” –PSProvider FileSystem –Root “\\london\data” –Persist
    New-PSDrive –Name “K” –PSProvider FileSystem –Root “\\london\desenhos” –Persist
    
    
    # Inicio das validações de grupo para fazer os mapeamentos
    
    # Verifica se o usuário pertence ao grupo DFS_DESENHO e mapeia a unidade R se positivo
    $result = get-groupMembership $strName "DFS_DESENHO"
    if ($result -eq '1') {
        $(New-Object -ComObject WScript.Network).RemoveNetworkDrive("R:");
        $(New-Object -ComObject WScript.Network).MapNetworkDrive("R:", "\\carolina\desenhos");
    }
    


    Até ai o script funciona direitinho, minha dúvida é como faço pra validar se o usuário é membro de um ou outro grupo e realizar o mapeamento por exemplo:

    Testar se o usuário é membro do grupo "Suporte Admins" ou do grupo "Suporte Admins Full e mapear a mesma unidade de rede. Tentei o exemplo abaixo e não tive sucesso...

    $result = get-groupMembership $strName "Suporte Admins" -or get-groupMembership $strName "Suporte Admins Full"
    if ($result -eq '1') {
        $(New-Object -ComObject WScript.Network).RemoveNetworkDrive("P:");
        $(New-Object -ComObject WScript.Network).MapNetworkDrive("P:", "\\london\suporte");
    }


    Outra dúvida é como faço para o usuario mapear o seu diretorio home usando o comando:

    New-PSDrive –Name “H” –PSProvider FileSystem –Root “\\london\$strName” –Persist


    Muito Obrigado pela ajuda.

    Abraços


    • Editado Fábio JrModerator terça-feira, 24 de setembro de 2013 21:17 Formatação do código
    terça-feira, 24 de setembro de 2013 19:27

Respostas

  • Jeferson,

    Fiz algumas modificações na Sub (nada demais, talvez tenha o mesmo efeito).

    Acho que o seu problema quando testava mais de um grupo eram os parenteses. Alter apenas os pareteses no seu script e teste se não funcionar então use o script abaixo.

    # Funções ------------------------------------------------
    function get-GroupMembership($DNName,$cGroup){
        
        $strFilter = "(&(objectCategory=User)(samAccountName=$strName))"
    
        $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
        $objSearcher.Filter = $strFilter
    
        $objPath = $objSearcher.FindOne()
        $objUser = $objPath.GetDirectoryEntry()
        $DN = $objUser.distinguishedName
            
        $strGrpFilter = "(&(objectCategory=group)(name=$cGroup))"
        $objGrpSearcher = New-Object System.DirectoryServices.DirectorySearcher
        $objGrpSearcher.Filter = $strGrpFilter
        
        $objGrpPath = $objGrpSearcher.FindOne()
        
        If (!($objGrpPath -eq $Null)){
            
            $objGrp = $objGrpPath.GetDirectoryEntry()
            
            $grpDN = $objGrp.distinguishedName
            $ADVal = [ADSI]"LDAP://$DN"
        
            if ($ADVal.memberOf.Value -eq $grpDN){
                return $TRUE
            }else{
                return $FALSE
        
            }
        
        }else{
                return $FALSE
        
        }
            
    }
    
    
    
    # Fim Funções ----------------------
    
    # Inicio Script
    
    $strName = $env:username
    
    
    Clear-Host
    # Remove todos os Mapeamentos Existentes
    Remove-PSDrive –Name “F”
    Remove-PSDrive –Name “G”
    Remove-PSDrive –Name “H”
    Remove-PSDrive –Name “I”
    Remove-PSDrive –Name “J”
    Remove-PSDrive –Name “K”
    Remove-PSDrive –Name “L”
    Remove-PSDrive –Name “M”
    Remove-PSDrive –Name “N”
    Remove-PSDrive –Name “O”
    Remove-PSDrive –Name “P”
    Remove-PSDrive –Name “Q”
    Remove-PSDrive –Name “R”
    Remove-PSDrive –Name “S”
    Remove-PSDrive –Name “T”
    Remove-PSDrive –Name “V”
    Remove-PSDrive –Name “U”
    Remove-PSDrive –Name “W”
    Remove-PSDrive –Name “X”
    Remove-PSDrive –Name “Y”
    Remove-PSDrive –Name “Z”
    Clear-Host
    
    #Inicia os Mapementos Padrão a Todos os Usuários
    
    New-PSDrive –Name “F” –PSProvider FileSystem –Root “\\london\data” –Persist
    New-PSDrive –Name “K” –PSProvider FileSystem –Root “\\london\desenhos” –Persist
    
    
    # Inicio das validações de grupo para fazer os mapeamentos
    
    # Verifica se o usuário pertence ao grupo DFS_DESENHO e mapeia a unidade R se positivo
    if (get-groupMembership $strName "DFS_DESENHO") {
        $(New-Object -ComObject WScript.Network).RemoveNetworkDrive("R:");
        $(New-Object -ComObject WScript.Network).MapNetworkDrive("R:", "\\carolina\desenhos");
    }
    
    
    # Verifica em dois grupos
    if ( (get-groupMembership $strName "Suporte Admins") -or (get-groupMembership $strName "Suporte Admins Full") ) {
        $(New-Object -ComObject WScript.Network).RemoveNetworkDrive("P:");
        $(New-Object -ComObject WScript.Network).MapNetworkDrive("P:", "\\london\suporte");
    }

    Vi que vc tem várias linha para desconectar unidades, tente usar esta aqui, vai ter o mesmo efeito de todas aquelas outras.

    net use /delete * /y


    Fábio de Paula Junior



    • Editado Fábio JrModerator sexta-feira, 27 de setembro de 2013 13:56 add info
    • Sugerido como Resposta Fábio JrModerator segunda-feira, 30 de setembro de 2013 12:39
    • Marcado como Resposta JefersonL segunda-feira, 30 de setembro de 2013 12:48
    sexta-feira, 27 de setembro de 2013 13:49
    Moderador