El Blog de Gualtrysoft

Windows 2000/2003/2008, Active Directory, VBScript, Hyper-V, PowerShell y todo aquello interesante a la hora de usar, configurar y administrar Windows Server. También tenemos longanizas…

PowerShell: Cmdlet Para Traducir un Nombre NetBios a Distinguido y Viceversa

Posted by urpiano en Domingo 21 \21\UTC octubre \21\UTC 2012

Esta función recibe como parámetro el nombre NetBios (Dominio\Objeto) de un objeto de Active Directory y devuelve su nombre distinguido (cn=Objeto,OU=OU,DC=dominio,DC=local), o recibe el nombre distinguido y devuelve el NetBios.

La forma de uso es muy sencilla: si se pasa el parámetro con el nombre NetBios devolverá el nombre distinguido, si se pasa el parámetro con el nombre distinguido, devolverá el nombre NetBios. Dado cómo está desarrollado, si se pasaran ambos parámetros, se ignoraría el nombre distinguido y el Cmdlet devolvería el nombre distinguido correspondiente al nombre NetBios recibido.

El script permite, además, establecer el usuario y la contraseña con los que validarse ante Active Directory para poder realizar la traducción; si se omiten, se realizará con el usuario que lanza el Cmdlet.

El Cmdlet incluye ayuda, pego a continuación la ayuda con modificador -Detailed (esta ayuda se basa en la prestación de ayuda basada en comentarios de PowerShell 2.0 ¿Qué todavía tienes la versión 1.0 y no la 2.0? ¿A qué esperas para instalarla si es mucho mejor?):

NOMBRE
    Get-NB2DN
    
SINOPSIS
    Esta función recibe un nombre NetBios y devuelve el correspondiente
    nombre distinguido o viceversa.
    
SINTAXIS
    Get-NB2DN [[-NetBios] ] [[-distinguishedName] ] [[-UserName] ] [[-Password] ] []
    
DESCRIPCIÓN
    Es un encapsulamiento del objeto NameTranslate. Permite obtener el
    nombre distinguido de un objeto cuyo nombre NetBios sea el pasado como parámetro
    NetBios o al reves, esto es, obtener el nombre NetBios del objeto cuyo nombre
    distinguido sea el pasado como parámetro distinguishedName.
    

PARÁMETROS
    -NetBios 
        Nombre NetBios del objeto de Active Directory del que se quiere obtener
        su nombre distinguido. Si se omite, se realizará la traducción del nombre
        distinguido al nombre NetBios. Este parámetro admite, además, el alias NB.
        
    -distinguishedName 
        Nombre distinguido del objeto de Active Directory del que se quiere
        obtener su nombre NetBios. Si se omite, se realizará la traducción del NetBios
        al nombre distinguido. Este parámetro admite, además, el alias DN.
        
    -UserName 
        Usuario con el que se producirá la validación al conectar al dominio;
        en caso de no establecerse, la conexión se realizará validando con el usuario
        que lanza la función. Se trata de o bien un nombre NetBios (DOMINIO\Usuario) o
        del nombre sAMAccountName de un usuario, en cuyo caso la función asumirá que se
        trata de un usuario del dominio al que pertenece el equipo desde el que se lanza
        la función. Este parámetro admite, además, el alias U.
        
    -Password 
        Contraseña del usuario con el que se producirá la validación al conectar
        al dominio; en caso de no pasarse el parámetro UserName, la conexión se
        realizará validando con el usuario que lanza la función y si Password fuese
        pasado se ignorará este parámetro. Este parámetro admite, además, el alias P.
        
    
        Este cmdlet admite los parámetros comunes Verbose, Debug,
        ErrorAction, ErrorVariable, WarningAction, WarningVariable,
        OutBuffer y OutVariable. Para obtener más información, escriba:
        "get-help about_commonparameters".
    
    -------------------------- EJEMPLO 1 --------------------------
    
    PS C:\>Get-NB2DN -NetBios "TIA\Bacterio"
    
    La Función devolverá el nombre distinguido, por ejemplo
    "cn=Bacterio,OU=I+D,DC=tia,DC=org"
    
    -------------------------- EJEMPLO 2 --------------------------
    
    PS C:\>Get-NB2DN -distinguishedName "cn=Bacterio,OU=I+D,DC=tia,DC=org"
    
    La función devolverá el nombre NetBios, por ejemplo "TIA\Bacterio"
    
NOTAS
    Para ver los ejemplos, escriba: "get-help Get-NB2DN -examples".
    Para obtener más información, escriba: "get-help Get-NB2DN -detailed".
    Para obtener información técnica, escriba: "get-help Get-NB2DN -full".

Este es el código del Cmdlet:

Function Get-NB2DN([Alias("NB")][String]$NetBios, `
                   [Alias("DN")][String]$distinguishedName, `
                   [Alias("U")][String] $UserName, `
                   [Alias("P")][String] $Password)
{
    # Creamos un objeto NameTranslate
    $Trans = New-Object -ComObject "NameTranslate"
    # Obtenemos el tipo del objeto, lo que nos permitirá invocar sus métodos
    $Type = $Trans.GetType()
    # Si NetBios no esta vacío, significa que hay que traducir de NT a DN
    If([String]::IsNullOrEmpty($NetBios) -eq $false)
    {
        # Este es el tipo que se suministrará como origen
        $NameType = 3 # Valor de ADS_NAME_TYPE_NT4
        # Este es el tipo que se solicitará en la traducción
        $NewType = 1  # Valor de ADS_NAME_TYPE_1779
        # Este es el nombre que se suministrará
        $Name = $NetBios
    }
    # Si distinguishedName no está vacío significa que hay que traducir de DN a
    # NT
    ElseIf([String]::IsNullOrEmpty($distinguishedName) -eq $false)
    {
        # Este es el tipo que se suministrará como origen
        $NameType = 1 # Valor de ADS_NAME_TYPE_1779
        # Este es el tipo que se solicitará en la traducción
        $NewType = 3  # Valor de ADS_NAME_TYPE_NT4
        # Este es el nombre que se suministrará
        $Name = $distinguishedName
    }
    # Si no se ha pasado ni nombre distinguido ni nombre netbios, se muestra un
    # mensaje notificándolo y se devuelve cadena vacía
    Else
    {
        Write-Host "Get-NB2DN: No se ha pasado ningún nombre" `
                   -ForegroundColor Red
        Return ""
    }
    # Lo primero es iniciar el traductor, indicando que se usará catálogo global
    # (ese 3 significa ADS_NAME_INITTYPE_GC).
    # La iniciación es diferente si pasamos o no credenciales. En primer lugar
    # lo haremos si no se han pasado credenciales
    If([String]::IsNullOrEmpty($UserName))
    {
        $Type.InvokeMember("Init", "InvokeMethod", $Null, $Trans, `
                                                          (3, $Null)) | Out-Null
    }
    # Ahora lo haremos si se han pasado credenciales
    Else
    {
        # Miraremos ahora si se ha recibido el nombre de dominio
        # (DOMINIO\Usuario)
        If($UserName -match "\\")
        {
            $Dominio = ($UserName -split "\\")[0].ToString()
            $Usuario = ($UserName -split "\\")[1].ToString()
        }
        # No se ha recibido el nombre del dominio (usuario), deberemos
        # averiguarlo
        Else
        {
            # Almacenamos el nombre de usuario
            $Usuario = $UserName
            # Obtenemos la RaizDSE
            $RaizDSE = New-Object System.DirectoryServices.DirectoryEntry `
                                        "LDAP://RootDSE",$UserName,$Password
            # Obtenemos el contenedor de particiones
            $Particiones = New-Object System.DirectoryServices.DirectoryEntry `
      "LDAP://CN=Partitions,CN=Configuration,$($RaizDSE.DefaultNamingContext)", `
                                      $UserName,$Password
            # Recorremos las particiones
            ForEach($Particion In $Particiones.Children)
            {
                # Si la partición actual es la correspondiente al dominio
                If($Particion.nCName -eq $RaizDSE.DefaultNamingContext)
                {
                    # Obtenemos el nombre NetBios
                    $Dominio = $Particion.NetBiosName.ToString()
                    # Terminamos el bucle
                    Break
                }
            }
        }
        # Ya tenemos todos los datos para poder iniciar le objeto NameTranslate
        # pasando usuario y contraseña
        $Type.InvokeMember("InitEx", "InvokeMethod", $Null, $Trans, `
                              (3, $Null,$Usuario,$Dominio,$Password)) | Out-Null
    }
    # Establecemos el nombre a traducir indicando el tipo de nombre que es
    $Type.InvokeMember("Set", "InvokeMethod", $Null, $Trans, `
                                                 ($NameType, "$Name")) |Out-Null
    # Obtenemos el nombre traducido indicando el tipo de nombre que queremos
    # obtener
    Return $type.InvokeMember("Get", "InvokeMethod", $Null, $Trans, $NewType)

<#
    .SYNOPSIS
        Esta función recibe un nombre NetBios y devuelve el correspondiente
nombre distinguido o viceversa.

    .DESCRIPTION
        Es un encapsulamiento del objeto NameTranslate. Permite obtener el
nombre distinguido de un objeto cuyo nombre NetBios sea el pasado como parámetro
NetBios o al reves, esto es, obtener el nombre NetBios del objeto cuyo nombre
distinguido sea el pasado como parámetro distinguishedName.

    .PARAMETER  NetBios
        Nombre NetBios del objeto de Active Directory del que se quiere obtener
su nombre distinguido. Si se omite, se realizará la traducción del nombre
distinguido al nombre NetBios. Este parámetro admite, además, el alias NB.

    .PARAMETER  distinguishedName
        Nombre distinguido del objeto de Active Directory del que se quiere
obtener su nombre NetBios. Si se omite, se realizará la traducción del NetBios
al nombre distinguido. Este parámetro admite, además, el alias DN.

    .PARAMETER  UserName
        Usuario con el que se producirá la validación al conectar al dominio;
en caso de no establecerse, la conexión se realizará validando con el usuario
que lanza la función. Se trata de o bien un nombre NetBios (DOMINIO\Usuario) o
del nombre sAMAccountName de un usuario, en cuyo caso la función asumirá que se
trata de un usuario del dominio al que pertenece el equipo desde el que se lanza
la función. Este parámetro admite, además, el alias U.

    .PARAMETER  Password
        Contraseña del usuario con el que se producirá la validación al conectar
al dominio; en caso de no pasarse el parámetro UserName, la conexión se
realizará validando con el usuario que lanza la función y si Password fuese
pasado se ignorará este parámetro. Este parámetro admite, además, el alias P.

    .EXAMPLE
        PS C:\> Get-NB2DN -NetBios "TIA\Bacterio"
La Función devolverá el nombre distinguido, por ejemplo
"cn=Bacterio,OU=I+D,DC=tia,DC=org"

    .EXAMPLE
        PS C:\> Get-NB2DN -distinguishedName "cn=Bacterio,OU=I+D,DC=tia,DC=org"
La función devolverá el nombre NetBios, por ejemplo "TIA\Bacterio"

    .INPUTS
        System.String,System.String

    .OUTPUTS
        System.String

    .NOTES
        Fernando Reyes López © 2012

    .LINK
        http://freyes.svetlian.com

    .LINK
        https://urpiano.wordpress.com

#>
}

Una respuesta to “PowerShell: Cmdlet Para Traducir un Nombre NetBios a Distinguido y Viceversa”

  1. […] PowerShell: Cmdlet Para Traducir un Nombre NetBios a Distinguido y Viceversa […]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: