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…

Script VBScript Para Listar Las Propiedades De La Pestaña Perfil De Todos Los Usuarios De Un Dominio

Posted by urpiano en Jueves 27 \27\UTC marzo \27\UTC 2008

Este script permite listar las propiedades de la pestaña Perfil de los usuarios del dominio en el que se consulta. Los datos que se muestran son:

-Nombre del usuario

-Nombre distinguido del usuario

-Nombre de inicio de sesión

-Nombre NT de inicio de sesión

-Ruta de su perfil

-Script de inicio de sesión

-Ruta de su carpeta personal

-Letra de su unidad personal

Sintaxis

cscript [//nologo] listar-propiedades-perfil-usuario-ad.vbs [/F:fichero] [/?] [dominio]

Siendo

Etiqueta Dato ¿Requerido? Descripción
  dominio No
Nombre FQDN (dominio.local) del dominio que se consulta. Si se omite, se consultará en el dominio al que pertenece el equipo desde el que se lanza el script.
F fichero No
Ruta y nombre del fichero en el que se volcarán los resultados. Si se omite, se muestran por pantalla. Los resultados son volcados en datos separados por tabulador, lo que es ideal para ser abierto con Excel.
?   No
Muestra la ayuda en línea.

Ejemplos:

– Muestra por pantalla los usuarios y sus propiedades, de la pestaña perfil, del dominio al que pertenece el equipo desde el que se lanza el script:

cscript //nologo listar-propiedades-perfil-usuario-ad.vbs

– Guarda en el fichero e:listadosscripts-usuarios.tsv usuarios y sus propiedades, de la pestaña perfil, del dominio al que pertenece el equipo desde el que se lanza el script:

cscript //nologo listar-propiedades-perfil-usuario-ad.vbs /F:e:\listadosscripts-usuarios.tsv

– Guarda en el fichero e:listadosscripts-usuarios.tsv los usuarios y sus propiedades, de la pestaña perfil, del dominio “tia.org”:

cscript //nologo listar-propiedades-perfil-usuario-ad.vbs /F:e:\listadosscripts-usuarios.tsv tia.org

Este es el código del script

'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'* listar-propiedades-perfil-usuario-ad.vbs                            *
'*                                                                     *
'* Este script permite listar las propiedades de la pestaña Perfil de  *
'* los usuarios del dominio en el que se consulta. Los datos que se    *
'* muestran son:                                                       *
'*                                                                     *
'* -Nombre del usuario                                                 *
'* -Nombre distinguido del usuario                                     *
'* -Nombre de inicio de sesión                                         *
'* -Nombre NT de inicio de sesión                                      *
'* -Ruta de su perfil                                                  *
'* -Script de inicio de sesión                                         *
'* -Ruta de su carpeta personal                                        *
'* -Letra de su unidad personal                                        *
'*                                                                     *
'* Sintaxis                                                            *
'*                                                                     *
'* cscript [//nologo] listar-propiedades-perfil-usuario-ad.vbs         *
'* [/F:fichero] [/?] [dominio]                                         *
'*                                                                     *
'* Siendo                                                              *
'*                                                                     *
'* - dominio (Opcional):                                               *
'*         Nombre FQDN (dominio.local) del dominio que se consulta. Si *
'*         se omite, se consultará en el dominio al que pertenece el   *
'*         equipo desde el que se lanza el script.                     *
'*                                                                     *
'* - /F: fichero (Opcional):                                           *
'*         Ruta y nombre del fichero en el que se volcarán los         *
'*         resultados. Si se omite, se muestran por pantalla. Los      *
'*         resultados son volcados en datos separados por tabulador,   *
'*         lo que es ideal para ser abierto con Excel.                 *
'*                                                                     *
'* - /?: ayuda (Opcional):                                             *
'*         Muestra la ayuda en línea                                   *
'*                                                                     *
'*                                                                     *
'* Ejemplos:                                                           *
'*                                                                     *
'* - Muestra por pantalla los usuarios y sus propiedades, de la        *
'* pestaña perfil, del dominio al que pertenece el equipo desde el que *
'* se lanza el script:                                                 *
'*                                                                     *
'* cscript //nologo listar-propiedades-perfil-usuario-ad.vbs           *
'*                                                                     *
'* - Guarda en el fichero e:listadosscripts-usuarios.tsv usuarios y  *
'* sus propiedades, de la pestaña perfil, del dominio al que pertenece *
'* el equipo desde el que se lanza el script:                          *
'*                                                                     *
'* cscript //nologo listar-propiedades-perfil-usuario-ad.vbs           *
'* /F:e:\listadosscripts-usuarios.tsv                                 *
'*                                                                     *
'* - Guarda en el fichero e:listadosscripts-usuarios.tsv los         *
'* usuarios y sus propiedades, de la pestaña perfil, del dominio       *
'* "tia.org":                                                          *
'*                                                                     *
'* cscript //nologo listar-propiedades-perfil-usuario-ad.vbs           *
'* /F:e:\listadosscripts-usuarios.tsv tia.org                         *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'* © Fernando Reyes                                                    *
'* Marzo De 2008                                                       *
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*

'Exigimos la declaración de variables
Option Explicit


Dim str_Error 'As String
Dim int_Error 'As String
Dim str_Dominio 'As String
Dim str_Fichero 'As String
Dim str_Salida 'As String
Dim obj_Usuario 'As Object
Dim obj_Dominio 'As Object

Dim obj_FS 'As Scripting.FileSystemObject
Dim obj_TS 'As Scripting.TextStream



'Validando los argumentos y almacenando
'sus valores
If f_RevisarArgumentos( _
                       str_Error, _
                       int_Error) Then

    Call s_Ayuda(str_Error)
    WScript.Quit int_Error

End If

'Preparamos los encabezados
str_Salida = _
        "Usuario" & vbTab & _
        "Nombre Distinguido" & vbTab & _
        "User Principal Name" & vbTab & _
        "sAMAccountName" & vbTab & _
        "Perfil" & vbTab & _
        "Script" & vbTab & _
        "Carpeta Personal" & vbTab & _
        "Unidad Personal"
        
'Si se guarda la salida en un fichero
If Len(str_Fichero) > 0 Then

    'Agregamos un salto de línea
    str_Salida = str_Salida & vbCrLf
    
'Si los resultados se muestran por pantalla
Else

    'Mostramos los encabezados
    WScript.Echo str_Salida
    
    'Los subrayamos
    WScript.Echo "=======" & vbTab & _
                 "==================" & vbTab & _
                 "==================" & vbTab & _
                 "==============" & vbTab & _
                 "======" & vbTab & _
                 "======" & vbTab & _
                 "================" & vbTab & _
                 "==============="
                 
    'Vaciamos la variable de salida
    str_Salida = ""

End If

'Obtenemos el objeto dominio con el proveedor WinNT
Set obj_Dominio = GetObject("WinNT://" & str_Dominio & ",Domain")

'Aplicamos un filtro al dominio para obtener los usuarios en un array
obj_Dominio.Filter = Array("User")

'Recorremos los usuarios
For Each obj_Usuario In obj_Dominio

    'Obtenemos las propiedades del usuario
    Call s_ListaUsuario(obj_Usuario.Name, str_Dominio)
    
    'Si hay que volcar los resultados en un fichero
    If Len(str_Fichero) > 0 Then
    
        'Agregamos un salto de línea a la salida
        str_Salida = str_Salida & vbCrLf
        
    'Si hay que mostrarlo por pantalla
    Else
    
        'Mostramos la información por pantalla
        WScript.Echo str_Salida
        
        'Vaciamos la variable de salida
        str_Salida = ""
    
    End If

Next 'obj_Usuario

'Vaciamos objetos
Set obj_Usuario = Nothing
Set obj_Dominio = Nothing

'Si hay que volcar información en el fichero
'de salida de ruta y nombre str_Fichero
If Len(str_Fichero) > 0 Then

    'Creamos un objeto FileSystemObject
    Set obj_FS = CreateObject("Scripting.FileSystemObject")

    'Creamos el fichero de salida
    Set obj_TS = obj_FS.CreateTextFile(str_Fichero)

    'Volcamos la información de salida en el fichero
    obj_TS.Write str_Salida

    'Cerramos el fichero de salida
    obj_TS.Close

    'Limpieza de popa :-)
    Set obj_TS = Nothing
    Set obj_FS = Nothing

End If

Sub s_ListaUsuario(str_UsuarioNT, str_DominioNT)
'***********************************************************************
'* Procedimiento: s_ListaUsuario                                       *
'* Tipo         : Método                                               *
'* Devolución   : Ninguna                                              *
'* Fecha y Hora : 27/03/2008 9:33:06                                   *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este método recibe un nombre NT de usuario y el      *
'*                nombre NT del dominio al que pertenece y lista las   *
'*                propiedades de la pestaña perfil de ese usuaio.      *
'***********************************************************************

    Const vbTextCompare = 1
    
    Dim obj_Usuario
    Dim str_Valor
    
    'Obtenemos el usuario con el proveedor LDAP
    Set obj_Usuario = GetObject("LDAP://" & _
                                    f_NTaDN(str_DominioNT & "" & _
                                    str_UsuarioNT, _
                                ""))
    
    'Obtenemos sus propiedades. Dado que algunas no las tienen todos
    'los objetos y eso puede producir un error al solicitarlas, ponemos
    'control de errores para que se ignore el error, y en lugar de
    'poner el valor de la propiedad directamente en la salida, primero
    'lo asignamos a la variable str_Valor, para que quede vacía cuando
    'se produzca un error y en la salida esa propiedad se muestre
    'vacía. Para ello, antes de asignar la propiedad a str_Valor,
    'debemos vaciar de contenido esta variable
    
    'Establecemos control de errores
    On Error Resume Next
    
    'Primero obtenemos el nombre
    str_Valor = ""
    str_Valor = Replace(obj_Usuario.Name,"CN=", "", 1, -1, _
                         vbTextCompare)
    str_Salida = str_Salida & _
                 str_Valor & vbTab
                         
    'Ahora su nombre distinguido
    str_Valor = ""
    str_Valor = obj_Usuario.Get("distinguishedName")
    str_Salida = str_Salida & _
                 str_Valor & vbTab
                 
    'Ahora su nombre de inicio de sesión
    str_Valor = ""
    str_Valor = obj_Usuario.Get("userPrincipalName")
    str_Salida = str_Salida & _
                 str_Valor & vbTab
                 
    'Ahora su nombre de inicio de sesión NT
    str_Valor = ""
    str_Valor = obj_Usuario.Get("sAMAccountName")
    str_Salida = str_Salida & _
                 str_Valor & vbTab

    'Ahora su ruta de perfil
    str_Valor = ""
    str_Valor = obj_Usuario.ProfilePath
    str_Salida = str_Salida & _
                 str_Valor & vbTab

    'Ahora su script de inicio de sesión
    str_Valor = ""
    str_Valor = obj_Usuario.ScriptPath
    str_Salida = str_Salida & _
                 str_Valor & vbTab

    'Ahora su carpeta personal
    str_Valor = ""
    str_Valor = obj_Usuario.HomeDirectory
    str_Salida = str_Salida & _
                 str_Valor & vbTab

    'Ahora su letra de unidad personal
    str_Valor = ""
    str_Valor = obj_Usuario.HomeDrive
    str_Salida = str_Salida & _
                 str_Valor
                 
    'Devolvemos el control de errores a CScript
    Err.Clear
    On Error Goto 0
                 
    'Limpieza de popa :-)
    Set obj_Usuario = Nothing

End Sub 's_ListaUsuario

Function f_RevisarArgumentos( _
                             str_Error, _
                             int_Error _
                             ) 'As Boolean
'***********************************************************************
'* Procedimiento: f_RevisarArgumentos                                  *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 27/03/2008 9:18:28                                   *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función revisa los argumentos recibidos,        *
'*                recogiendo los posibles fallos por falta de          *
'*                argumentos requeridos y almacenando en las           *
'*                variables correspondientes los argumentos            *
'*                recibidos. recibe dos parámetros cuyo fin es ser de  *
'*                salida: una cadena que almacenará los errores        *
'*                detectados y un entero que almacenará el código de   *
'*                los errores detectados. Hay tres tipos de error;     *
'*                error 1 para los argumentos sin nombre requeridos y  *
'*                no encontrados, error 2 para los argumentos con      *
'*                nombre requeridos y no encontrados, por último,      *
'*                error 4 para los combos de argumentos opcionales     *
'*                (un combo de argumentos opcionales es aquel          *
'*                conjunto de argumentos opcionales que es requerido   *
'*                que se pase al menos uno de ellos y que si se pasa   *
'*                más de uno se ignorarán aquellos que estén detrás    *
'*                en la prioridad entre ellos; una característica      *
'*                clara de lo que es un combo de argumentos es cuando  *
'*                dos omás argumentos almacenan su valor en la misma   *
'*                variable). En el caso de producirse más de un tipo   *
'*                de error, el número de error será la suma de ambos   *
'*                de los errores recibidos, es decir 3, 5 o 6          *
'***********************************************************************

    Dim bol_Devolucion 'As Boolean
    Dim bol_Error1 'As Boolean
    Dim bol_Error2 'As Boolean
    Dim bol_Error4 'As Boolean

    'Iniciamos los indicadores
    bol_Devolucion = False
    bol_Error1 = False
    bol_Error2 = False
    bol_Error4 = False


    'Si hay que mostrar la ayuda, se muestra y
    'termina el script
    If WScript.Arguments.Named.Exists("?") Then

        Call s_Ayuda("******************" & vbCrLf & _
                     "*     AYUDA      *" & vbCrLf & _
                     "******************")

        WScript.Quit 0

    End If

    'Guardamos los argumentos en las variables
    'correspondientes
    If _
      WScript.Arguments.Unnamed.Count - 1 _
      >= 0 Then
    
        'Obtenemos el nombre NT del dominio a partir del nombre FQDN
        'al que transformamos en nombre distinguido y lo pasamos a la
        'función f_NTaDN que nos devolverá el nombre NT
        str_Dominio = _
                   f_NTaDN("","DC=" & Replace( _
                              WScript.Arguments.Unnamed(0),".",",DC="))
                              
        'El objeto NameTranslation suele devolver el nombre de los
        'dominios terminados en barra de división entera (backslash),
        'se la quitamos
        If Right(str_Dominio, 1) = "" Then _
                str_Dominio = Left(str_Dominio,Len(str_Dominio) - 1)
                   
    Else
    
        'No se ha pasado el nombre del dominio, vamos a usar el dominio
        'al que pertenece el usuario que lanza el script. Para ello usaremos
        'un objeto wshNetwork
        Dim obj_NW 'As wshNetwork
        
        'Creamos el objeto wshNetWork
        Set obj_NW = CreateObject("Wscript.Network")
        
        'Obtenemos el nombre NT del dominio
        str_Dominio = obj_NW.UserDomain 

        'Limpiamos las zurraspillas :-)
        Set obj_NW = Nothing
        
    End If


    'Revisamos que esté el argumento
    '/F (fichero)
    If WScript.Arguments.Named.Exists("F") Then

        str_Fichero =  _
               WScript.Arguments.Named("F")

    End If

    'Preparamos las variables de devolucion:
    'el entero como suma de los posibles errores 1, 2 y 4
    int_Error = Abs(bol_Error1) + _
                (2 * Abs(bol_Error2)) + _
                (4 * Abs(bol_Error4))
    'La devolucion de la función será True en caso de
    'haber alguno de los errores
    bol_Devolucion = (bol_Error1 Or bol_Error2 Or bol_Error4)

    'Hacemos la devolución de la función
    f_RevisarArgumentos = bol_Devolucion

End Function 'f_RevisarArgumentos

Sub s_Ayuda(str_Error)
'***********************************************************************
'* Procedimiento: s_Ayuda                                              *
'* Tipo         : Sub                                                  *
'* Devolución   :                                                      *
'* Fecha y Hora : 27/03/2008 10:48:43                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este procedimiento muestra la ayuda en línea.        *
'*                Recibe un parámetro de tipo cadena que si viene      *
'*                será mostrado antes de la línea; pensado para que    *
'*                se muestre un error que se haya detectado.           *
'***********************************************************************

    'Si hay que mostrar algún texto previo a la ayuda, lo hacemos
    If Len(str_Error) > 0 Then

        WScript.Echo str_Error & vbCrLf & vbCrLf

    End If

    'A continuación, mostramos la ayuda por pantalla
    WScript.Echo "Este script permite listar las propiedades de la " & _
                 "pestaña Perfil de los usuarios"
    WScript.Echo "del dominio en el que se consulta. Los datos que " & _
                 "se muestran son:"
    WScript.Echo ""
    WScript.Echo "-Nombre del usuario"
    WScript.Echo "-Nombre distinguido del usuario"
    WScript.Echo "-Nombre de inicio de sesión"
    WScript.Echo "-Nombre NT de inicio de sesión"
    WScript.Echo "-Ruta de su perfil"
    WScript.Echo "-Script de inicio de sesión"
    WScript.Echo "-Ruta de su carpeta personal"
    WScript.Echo "-Letra de su unidad personal"
    WScript.Echo ""
    WScript.Echo "Sintaxis"
    WScript.Echo ""
    WScript.Echo "cscript [//nologo] listar-propiedades-perfil-usua" & _
                 "rio-ad.vbs [/F:fichero] [/?]"
    WScript.Echo "[dominio]"
    WScript.Echo ""
    WScript.Echo "Siendo"
    WScript.Echo ""
    WScript.Echo "- dominio (Opcional):"
    WScript.Echo "Nombre FQDN (dominio.local) del dominio que se co" & _
                 "nsulta. Si se"
    WScript.Echo "omite, se consultará en el dominio al que pertene" & _
                 "ce el equipo"
    WScript.Echo "desde el que se lanza el script."
    WScript.Echo ""
    WScript.Echo "- /F: fichero (Opcional):"
    WScript.Echo "Ruta y nombre del fichero en el que se volcarán l" & _
                 "os resultados."
    WScript.Echo "Si se omite, se muestran por pantalla. Los result" & _
                 "ados son"
    WScript.Echo "volcados en datos separados por tabulador, lo que" & _
                 " es ideal para"
    WScript.Echo "ser abierto con Excel."
    WScript.Echo ""
    WScript.Echo "- /?: ayuda (Opcional):"
    WScript.Echo "Muestra la ayuda en línea"
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo "Ejemplos:"
    WScript.Echo ""
    WScript.Echo "- Muestra por pantalla los usuarios y sus propied" & _
                 "ades, de la pestaña perfil,"
    WScript.Echo "del dominio al que pertenece el equipo desde el q" & _
                 "ue se lanza el script:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-propiedades-perfil-usuari" & _
                 "o-ad.vbs"
    WScript.Echo ""
    WScript.Echo "- Guarda en el fichero e:listadosscripts-usuari" & _
                 "os.tsv usuarios y sus"
    WScript.Echo "propiedades, de la pestaña perfil, del dominio al" & _
                 " que pertenece el equipo desde"
    WScript.Echo "el que se lanza el script:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-propiedades-perfil-usuari" & _
                 "o-ad.vbs"
    WScript.Echo "/F:e:\listadosscripts-usuarios.tsv"
    WScript.Echo ""
    WScript.Echo "- Guarda en el fichero e:listadosscripts-usuari" & _
                 "os.tsv los usuarios y sus"
    WScript.Echo "propiedades, de la pestaña perfil, del dominio """ & _
                 "tia.org"":"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-propiedades-perfil-usuari" & _
                 "o-ad.vbs"
    WScript.Echo "/F:e:\listadosscripts-usuarios.tsv tia.org"
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo ""

End Sub 's_Ayuda

Function f_NTaDN(str_RutaNT, str_DN)
'***********************************************************************
'* Procedimiento: f_NTaDN                                              *
'* Tipo         : Función                                              *
'* Devolución   : Cadena                                               *
'* Fecha y Hora : May 2007                                             *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe o bien el nombre NT              *
'*                ("dominionombre"), como primer parámetro, de un     *
'*                objeto de dominio y devuelve el nombre distinguido   *
'*                de ese objeto, o bien el nombre distinguido de un    *
'*                objeto, como segundo parámetro, y devuelve el        *
'*                nombre NT.                                           *
'*                Basada en el código de Richard Mueller, MVP de       *
'*                Scripting y ADSI (http://www.rlmueller.net)          *
'***********************************************************************

    'Constantes para el objeto NameTranslate
    Const ADS_NAME_INITTYPE_GC = 3
    Const ADS_NAME_TYPE_NT4 = 3
    Const ADS_NAME_TYPE_1779 = 1

    Dim obj_TraductorDeNombres
    Dim int_De, int_A,str_Nombre

    If  Len(str_RutaNT) > 0 Then

        int_De = ADS_NAME_TYPE_NT4
        int_A = ADS_NAME_TYPE_1779
        str_Nombre = str_RutaNT

    ElseIf Len(str_DN) > 0 Then

        int_De = ADS_NAME_TYPE_1779
        int_A = ADS_NAME_TYPE_NT4
        str_Nombre = str_DN

    Else

        WScript.Echo "Error 1 en f_NTaDN: No se ha pasado " & _
                     "ningún nombre para traducir."
        Exit Function
    End If
    'Creamos el objeto NameTranslate.
    Set obj_TraductorDeNombres = CreateObject("NameTranslate")

    On Error Resume Next

    'Lo iniciamos localizando el catálogo global
    obj_TraductorDeNombres.Init ADS_NAME_INITTYPE_GC, ""

    'Establecemos el parámetro de nombre en el traductor de nombres
    obj_TraductorDeNombres.Set int_De, str_Nombre

    'Usamos el método Get del traductor de nombres para obtener el
    'nombre traducido
    f_NTaDN = obj_TraductorDeNombres.Get(int_A)

    'Limpieza de kks :-)
    Set obj_TraductorDeNombres = Nothing

    On Error GoTo 0

End Function 'f_NTaDN

 

 

23 comentarios to “Script VBScript Para Listar Las Propiedades De La Pestaña Perfil De Todos Los Usuarios De Un Dominio”

  1. shayro said

    Hola a todos ! Los molesto por lo siguiente necesitaria un Script que la idea es correrlo a traves de una GPO de inicio de sesion , que de una lista de usuarios que yo le de en un archivo.txt me chekeara si el o los usuarios de esa lista pertenecen al grupo local Administradores del pc si esta en la lista y esta en el grupo no los toque , sino esta en la lista y esta en el grupo lo borre, , sera mucho pedir ? si que ne la vuelta hay unos cuantos Mostros capaces de lograrlo , recien estoy arrancando con el tema de los Scripts y no soy capaz todavia de crear algo asi , y lo necesito!!.

    que lo haga solo con usuarios dentro de este grupo local no con grupos , como pueden ser grupos globales estos ultimos que no los toque ya que tengo al grupo domain admins y un grupo de soporte alli tambien

    Gracias por lo que puedan hacer.

  2. urpiano said

    Shayro,

    Creo que estás enfocando mal este tema, pues me parece que lo que en realidad buscas es una GPO de grupos restringidos:

    Description of Group Policy Restricted Groups

    HOW TO: Use Restricted Groups in Windows 2000

  3. shayro said

    no en realidad lo que busco es un script que funcione como lista de control con grupos restringidos , me limpia completamente el grupo local de administradores cada vez que se aplica la GPO, por lo menos asi funciona en Windows 2000 server , creo que en 2003 esta forma esta corregida , pero por haora no puedo migrar, y con el script controlo esta pertenencia al grupo de forma centralizada y ademas me aseguro que ningun usuario se meta para dentro del grupo de vivo , por que algun tecnico de helpdesk le hizo un favor u otras situaciones , si no esta en la lista que consulta el script lo borra del grupo , y haora que estoy pensando ademas en la lista tambien deberia estar asociada la forma de identificar el pc donde es administrador , a travez del la macaddres o algun dato de ese estilo.

  4. rafa said

    ¿Sabrias indicarme por donde tirar para hacer un acceso directo en un pc remoto?

  5. urpiano said

    Rafa,

    ¿No podrías crearlo en el PC local y copiarlo en el remoto?

  6. rafa said

    No porque formará parte de un script de copia de ficheros cuyo path de ubicacion final será el que el administrador decida segun proceda.

  7. urpiano said

    Rafa,

    Sigue siendo lo mismo, creo. Tienes el acceso directo creado de forma manual en una carpeta compartida y el script lo copia donde deba.

  8. urpiano said

    Rafa,

    De todas formas:

    Create shortcut (VBScript)

  9. shayro said

    Caballero Urpiano! podria Usted darme una mano con este tema , le paso a explicar la situacion :

    Tengo un Script que hace lo siguiente : * limpia grupo de administradores local de un equipo
    * Renombra usuario Administrador
    * Cambio clave de usuario administrador local
    * Agrega a un grupo global del dominio al grupo local Administradores

    Tengo 2 pequenos problemas: 1 , cuando * limpia grupo de administradores local del equipo , necesito que limpie segun un criterio, que de una lista de usuarios que yo le con un Array , Lista.txt , me coteje si el o los usuarios locales o de dominio de esa lista,que pertenecen al grupo local Administradores del pc , si esta en la lista y esta en el grupo no los toque , si no esta en la lista, y esta en el grupo lo borre , el chekeo debe ser con doble condicion en la lista porque debe estar asociado al nombre de la maquina o la Mac Address, o sea que chekee doble condicion en la lista , pondria 2 capos usuario y nombre de PC o Mac Address, sino el usuario en la lista en cuaestion seria Administrador en todas las maquinas del dominio donde se loguee y yo lo queiro agregar a una maquina en particular

    2 * Renombra usuario Administrador, cuando el script Renombra la cuanta , si un usuario es administrador y me cambia el nombre a la cuanta adminsitrador el script fallara en esta parte , se que por GPO Policy directamente puedo renombrarle pero necesito que sea a travez de script por tema de sincronia se me ocurre que podria ser algo como que no importe el nombre que tenga la cuenta administrador para caulquier valor que tenga siemrpe la renombre con un valor dado , para esto haria que identidicarla especificamente de otras cuentas locales de administracion tal vez identificandola a travez del id que termina en 500 me parece,

    Alguien sabe como solucionar estos 2 temas?

    ‘==========================================================================

    ‘ VBScript Source File — Created with SAPIEN Technologies PrimalSCRIPT(TM)

    ‘ NAME:


    ‘ DATE : 13/05/2008

    ‘ COMMENT:

    ‘==========================================================================

    ‘********************************** limpia grupo de administradores local de un equipo *******************************************************
    Sub LimpiaAdmins

    Set colGroups = GetObject(“WinNT://” & strComputer & “”)
    colGroups.Filter = Array(“Group”)
    For Each objGroup In colGroups
    ‘Wscript.Echo objGroup.Name
    If ObjGroup.Name=”Administradores” then
    For Each objUser in objGroup.Members
    If (UCASE(objUser.Name) UCase(“domain admins”)) And (objUser.Name “AdminLocalesPC”) Then

    on error resume Next
    Set objUser2 = GetObject(“WinNT://” & “NTDOM1” & “/” & objUser.Name,user)

    on error resume Next
    Set objUser3 = GetObject(“WinNT://” & strComputer & “/” & objUser.Name ,user)

    on error resume Next
    objGroup.Remove(objUser2.ADsPath)

    on error resume Next
    objGroup.Remove(objUser3.ADsPath)

    End if
    Next
    End if
    Next
    End Sub

    ‘************************ Renombra usuario Administrador ****************************************************
    Sub RenombraAdmin(strNewName)

    If (ExistUser(strNewName) = FALSE) Then
    ‘ —— END CONFIGURATION ———
    ‘WScript.Echo strnewName
    set objComputer = GetObject(“WinNT://” & strComputer)
    set objUser = GetObject(“WinNT://” & strComputer & _
    “/Administrador,user”)
    set objNewUser = objComputer.MoveHere(objUser.ADsPath,strNewName)
    ‘WScript.Echo “Successfully renamed account to: ” & strNewName
    End if
    End Sub

    ‘ *********************** Cambio clave de usuario administrador local ***************************************
    Sub CambiarClaveAdmin(strNewAdmin,strClave)

    Set WshShell = WScript.CreateObject(“WScript.Shell”)

    ‘Query Admin Members
    Set colGroups = GetObject(“WinNT://” & strComputer)
    colGroups.Filter = Array(“group”)
    For Each objGroup In colGroups
    ‘check the administrators local group members..
    If (InStr(1,objGroup.Name,”Administradores”,1) >0) Then
    For Each objUser in objGroup.Members
    strUSER=strUSER &vbCrLf& objuser.class &”=”& objUser.name
    next
    End If
    Next

    Set objUser = GetObject(“WinNT://” & strComputer & “/” & strNewAdmin)
    objUser.SetPassword strClave
    objUser.Setinfo

    End Sub

    ‘******************* Agrego los admin locales ******************************************
    Sub AgregoAdminLocales(strGroup)

    strNetBIOSDomain=”NTDOM1″

    Set objLocalGroup = GetObject(“WinNT://” & strComputer & “/Administradores,group”)

    Set objGroup = GetObject(“WinNT://” & strNetBIOSDomain & “/” & strGroup & “,group”)

    Set objWMIService = GetObject(“winmgmts:\\” & strComputer & “\root\cimv2”)

    If (IsMember(objLocalGroup, objGroup) = False) Then
    objLocalGroup.Add “WinNT://” & strNetBIOSDomain & “/” & strGroup
    End If
    End sub

    ‘********************** funciones auxiliares de AdminLocal**********************
    Function ExistUser(strUser)

    Set colGroups = GetObject(“WinNT://” & strComputer & “”)
    colGroups.Filter = Array(“Group”)
    ExistUser=FALSE
    For Each objGroup In colGroups
    ‘Wscript.Echo objGroup.Name
    If ObjGroup.Name=”Administradores” then
    For Each objUser in objGroup.Members
    If (UCASE(objUser.Name)=UCASE(strUser)) Then
    ””’ WScript.echo objUser.Name & ” = ” & strUser
    ExistUser=TRUE
    End if
    Next
    End if
    Next
    End Function

    Function IsMember(ByVal objGroup, ByVal objDomainGroup)
    Dim objMember
    For each objMember In objGroup.Members
    If (LCase(objMember.AdsPath) = LCase(objDomainGroup.AdsPath)) Then
    IsMember = True
    Exit Function
    End If
    If (LCase(objMember.Class) = “group”) Then
    If (InStr(LCase(objMember.AdsPath), “/” & LCase(strComputer) & “/”) > 0) Then
    IsMember = IsMember(objMember, objDomainGroup)
    If (IsMember = True) Then
    Exit Function
    End If
    End If
    End If
    Next
    IsMember = False
    End Function

    ‘***************** Rutina Principal del script *****************************************

    strComputer = WScript.Arguments(0)

    AgregoAdminLocales(“AdminLocalesPC”)
    LimpiaAdmins
    RenombraAdmin “NewAdmin”
    CambiarClaveAdmin “NewAdmin”,”password2008″

    WScript.Echo(“fin”)

  10. urpiano said

    Shayro,

    Puedes obtener un array con los usuarios del dominio que quieres que sean miembros a partir de un fichero de texto que tenga un usuario por línea de esta manera:

    Dim obj_FS 'As Scripting.FileSystemObject
    Dim obj_TS 'As Scripting.TextStream
    Dim arr_Usuarios 'As String
    Dim str_Usuario 'As String
    Dim str_Fichero 'As String

    str_Fichero = "\\Servidor\Carpeta\fichero.txt"
    Set obj_FS = CreateObject("Scripting.FileSystemObject")
    Set obj_TS = obj_FS.OpenTextFile(str_Fichero)

    arr_Usuarios = Split(obj_TS.ReadAll,vbCrLf)

    'Ahora lo que habría que hacer es borrar todas las membresías del grupo
    'administradores del equipo local, agregar al administrador local, los
    'grupos de domain admins y todos aquellos grupos que necesites que estén:

    Dim obj_Grupo
    Dim obj_Miembro
    Dim obj_NW

    Set obj_NW = CreateObject("WScript.Network")

    Set obj_Grupo = GetObject("WinNT://" & obj_NW.ComputerName & "/Administradores,group")

    'Eliminamos los miembros del grupo
    For Each obj_Miembro In obj_Grupo.Members

        If obj_Miembro.Class = "User" Then

            obj_Grupo.Remove obj_Miembro.ADsPath, user

        ElseIf obj_Miembro.Class = "Group" Then

            obj_Grupo.Remove obj_Miembro.ADsPath, group

        End If

    Next 'obj_Miembro

    'Vamos a agregar al administrador y al grupo de Domain Admins
    obj_Grupo.Add("WinNT://" & obj_NW.ComputerName & "/Administrador,user")
    obj_Grupo.Add("WinNT://" & obj_NW.UserDomain & "/Domain Admins,group")

    'Por último, recorremos el array que obtuvimos antes con los usuarios a incluir y los agregamos
    For Each str_Usuario In arr_Usuarios

        obj_Grupo.Add("WinNT://" & obj_NW.UserDomain & "/" & str_Usuario & ",user")

    Next 'arr_Usuarios

  11. shayro said

    Muchisimas gracias Urpiano !

  12. shayro.mendez said

    Me surgio una duda , el array con la lista que recorre para agrgar el usuario en la lista debe estar asociado a la PC (que chekee elnombre del pc o la macaddres) donde quiero que sea administrador , porque el script pretendo correrlo como script de inicio de sesion por policy en computers, sino el o los usuarios en la lista serian administradores de todos los equipo y no de el equipo que tienen asignado.

  13. urpiano said

    Shayro,

    Perdona, pero no te he entendido. De todas formas, si un usuario no es administrador del equipo, no podrá correr este script, pues realiza tareas para las que debe ser administrador del equipo. Por ello el script debería ser ejecutado como script de inicio de equipo, no de inicio de sesión de usuario.

  14. shayro said

    A ver si me explico, quiero que el script recorra la lista de miembros del grupo local Administradores y que coteje contra una lista dada en ecxel donde estara el usuario(racf) y el nombre del pc o macaddress del pc , si el script encuentra a ese o esos(puede ser mas de uno) usuario de la lista ecxel en el grupo local Administradores de de especificamente el pc que segun la lista le corresponde lo respeta , porque esta en la lista , pero todo usuario que encuantre en el grupo local Administradores , de los Pcs sim no encuentra su correspondencia en la lista los borra. oficia de lista de control y para que lo respete o sea no lo borre del grupo local de Administradores tiene que cumplir esa doble condicion estar en la lista y el nombre del pc al lado del racf (usuario) tiene que coincidir tambien o sea consulta el grupo local Adminiastradores si el o los usuarios que encuantra en la consulta estan en la lista que lea de un exel y el nombre del pc donde encauntra a el o los usuarios coinciden los deja pero si no lo borra No lo puedo poner mas claro no se como explicarlo , este script va a correr como un script de inicio de sesion bajo computers por lo que correra con permisos de System por lo que con los permisos no hay drama.

  15. Jose Ramon Pernia Reyes said

    Buenas tardes, antes que nada felicitarte por tu pagina muy buena por otra parte quería agregarle que me liste los usuarios por grupos, es decir que me indique a que grupo pertenece cada usuario, esto porque he visto que tenemos usuarios en distintos grupos en algunos casos redundante y en otros con mayor privilegios lo cual se requiere depurar.

  16. urpiano said

    Shayro,

    No me convence esta operativa, la verdad. Es necesario que se ejecute el script con privilegios administrativos en el equipo. Si se hace con un script de inicio de equipo esto no es problema, pero si se tiene que hacer, como es tu requerimiento, con un script de inicio de sesión, sería necesario también que se utilizase un mecanismo de RUNAS en el script para que pudiera hacer su tarea. Esto implica que la contraseña de administrador local de los equipos debe estar escrita en el propio script, lo cual no es nada deseable. Además de este fallo de seguridad, tiene un fallo en la propia operativa, pues si un usuario está como administrador del equipo y no debe estarlo, el script le quita de ser administrador, pero ese usuario que está ejecutando el script ya tiene un token de usuario que es administrador, con lo que no dejará de ser administrador hasta el siguiente inicio de sesión, lo que le permitiría volver a agregarse como administrador y nunca dejaría de serlo.

    ¿No podrías poner las cuentas de los equipos en diferentes OUs, de manera que a cada OU le asignases una GPO distinta que ejecutase el script como script de inicio de equipo y recibiera su propia lista de usuarios a los que se les haría administradores locales? O aún mejor, hacer esto con los equipos encendidos, de forma remota, no por GPO, pues es absurdo que cada vez que el equipo arranque se le vuelva a poner la misma lista de usuarios como administradores locales.

  17. urpiano said

    Jose Ramon Pernia Reyes,

    Listar las membresías de grupo de los usuarios no es una tarea trivial, pues pueden ser miembros de un grupo sin serlo directamente, al ser miembros de un grupo que es miembro de otro grupo. Esto se exlica muy bien aquí:

    http://www.rlmueller.net/MemberOf.htm

  18. shayro said

    Urpiano talvez lo exprese mal el script va a correr como un script de inicio de equipo!
    Por lo tanto se ejecutara con privilegios administrativos en el equipo.

  19. TommyX said

    Hola que tal ?

    hace unas semanas descubri este blog, y la verdad con dos scripts que he empleado de por aquí y modificandolos a mi gusto, me han ayudado mucho.

    Enhorabuena por el blog !

  20. adriana said

    me puedes ayudar yo quiero agregar un grupo global de dominio al grupo local de administrador pero lo estoy haciendo con esto net localgroup administradores dominio\grupo /add y lo pongo como archivo cmd al inicio del equipo pero no funciona que debo hacer

  21. urpiano said

    Adriana,

    ¿No te valdría hacerlo por GPO de grupos restringidos?

    Description of Group Policy Restricted Groups

    HOW TO: Use Restricted Groups in Windows 2000

  22. Alfredo said

    Por favor si alguien me puede ayudar tengo el siguiente problemita:
    1. Agregar pc’s a un dominio cambiando la contraseña de administrador del equipo local
    2. Establecer políticas a ciertas carpetas con permisos de diferentes unidades organizativas.
    3. permitir cargar conexiones varias conexiones de red de acuerdo a Políticas.
    3. ejecutar una .exe

    Que se pueda hacer con solo ejecutar algún comando (script)

    Por su colaboración les agredezco.

  23. Dafne said

    Hola:
    Ante todo daros la enhorabuena por este portal pues me parece excelente.
    Mi problema es que ejecuto este script y me crea un fichero que solo tiene esta linea:
    Usuario Nombre Distinguido User Principal Name sAMAccountName Perfil Script Carpeta Personal Unidad Personal
    ¿Alguien sabe que es lo que pasa?
    El usuario con que ejecuto el script es administrador del dominio.
    Muchas gracias.

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: