none
Dudas del funcionamiento de los scripts RRS feed

  • Pregunta

  • Hola,

    En la empresa en la que trabajo estoy migrando los scripts realizados por un compañero de kixstart a powershell. El problema es que me encuentro bastante perdido ya que no se como se ejecuta un script logon que se encuentra ubicado en una directiva de grupo. Me explico, cuando yo inicio mi sesión y se carga el script que se encuntra ubicado en el servidor, ¿donde se esta ejecutando realmente el script?¿en mi ordenador?¿en el servidor?. 

    Esta pregunta me aparece porque necesito saber a los grupos que pertenece un usuarios del AD y cuando pruebo el script en el servidor por medio de un dsquery funciona perfectamente (me devuelve los grupos), pero cuando se ejecuta como inicio de sesion desde el ordenador no me devuelve nada.

    Saludos,

    jueves, 31 de julio de 2014 23:04

Todas las respuestas

  • Eso te pasa porque para tener dsquery tienes que tener las herramientas de administración de AD instaladas en el equipo en el que se quiere ejecutar. Para encontrar las membresías de un usuario es mejor hacerlo por ADSI, que no requiere la instalación de nada. La mayor dificultad es que las variables de entorno te dan el nombre sAMAccountName del usuario y necesitas el nombre distinguishedName. Esto es una muestra de cómo puedes unir en un script dos de R. L. Mueller para poder obtener los grupos a los que pertenece un usuario en un script de logon:

    Function NTaDN($Name)
    {
        # Retrieve Distinguished Name of current domain.
        $Domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
        $Root = $Domain.GetDirectoryEntry()
        $Base = ($Root.distinguishedName)
    
        # Use the NameTranslate object.
        $objTrans = New-Object -comObject "NameTranslate"
        $objNT = $objTrans.GetType()
    
        # Invoke the Init method to Initialize NameTranslate by locating
        # the Global Catalog. Note the constant 3 is ADS_NAME_INITTYPE_GC.
        $objNT.InvokeMember("Init", "InvokeMethod", $Null,     $objTrans, (3, $Null))
    
        # Use the Set method to specify the Distinguished Name of the current domain.
        # Note the constant 1 is ADS_NAME_TYPE_1779.
        $objNT.InvokeMember("Set", "InvokeMethod", $Null, $objTrans, (1, "$Base"))
    
        # Use the Get method to retrieve the NetBIOS name of the current domain.
        # Note the constant 3 is ADS_NAME_TYPE_NT4.
        # The value retrieved includes a trailing backslash.
        $strDomain = $objNT.InvokeMember("Get", "InvokeMethod", $Null, $objTrans, 3)
    
        # Retrieve Distinguished Name of specified object.
        $objNT.InvokeMember("Set", "InvokeMethod", $Null, $objTrans, (3, "$strDomain$Name"))
        $DN = $objNT.InvokeMember("Get", "InvokeMethod", $Null, $objTrans, 1)
        $DN
    }
    
    Function IsMember($ADObject, $GroupName)
    {
        If ($GroupList.Count -eq 0)
        {
            # Retrieve tokenGroups attribute, which is operational (constructed).
            $ADObject.psbase.RefreshCache("tokenGroups")
            $SIDs = $ADObject.psbase.Properties.Item("tokenGroups")
            # Populate hash table with security group memberships.
            ForEach ($Value In $SIDs)
            {
                $SID = New-Object System.Security.Principal.SecurityIdentifier $Value, 0
                $Group = $SID.Translate([System.Security.Principal.NTAccount])
                If($GroupList.Keys -notcontains ($Group.Value.Split("\")[1]))
                {$GroupList.Add($Group.Value.Split("\")[1], $True)}
            }
        }
        If ($GroupList.ContainsKey($GroupName))
        {
            Return $True
        }
        Else
        {
            Return $False
        }
    }
    Trap {"Error: $_"; Break;}
    
    $GroupList = @{}
    
    $User = [ADSI]"LDAP://$(NTaDN $env:UserName)"
    $GroupName = "Contabilidad"
    If ((IsMember $User $GroupName) -eq $True)
    {
        "El usuario " + $User.sAMAccountName + " es miembro del grupo " + $GroupName
    }
    Else
    {
        "El usuario " + $User.sAMAccountName + " NO es miembro del grupo " + $GroupName
    }
    No tienes más que copiar y pegar todo y personalizar $GroupName = "Contabilidad", para poner tantas consultas a grupos como necesites, repitiendo, tantas veces como grupos quieras consultar, la estructura $GroupName = "nombre de grupo" más la estructura If/Else que tiene a continuación


    Un saludo

    Fernando Reyes
    MCSA 2000/2003/2012
    MCSE 2000/2003
    MCITP Enterprise Administrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/


    lunes, 29 de septiembre de 2014 9:28
    Moderador