Script VBScript Para Listar Las Propiedades De La Pestaña Perfil De Todos Los Usuarios De Un Dominio
Publicado por urpiano en Jueves 27 de Marzo de 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
shayro escribió
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.
urpiano escribió
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
shayro escribió
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.
rafa escribió
¿Sabrias indicarme por donde tirar para hacer un acceso directo en un pc remoto?
urpiano escribió
Rafa,
¿No podrías crearlo en el PC local y copiarlo en el remoto?
rafa escribió
No porque formará parte de un script de copia de ficheros cuyo path de ubicacion final será el que el administrador decida segun proceda.
urpiano escribió
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.
urpiano escribió
Rafa,
De todas formas:
Create shortcut (VBScript)
shayro escribió
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”)
urpiano escribió
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.FileSystemObjectDim 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
shayro escribió
Muchisimas gracias Urpiano !
shayro.mendez escribió
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.
urpiano escribió
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.
shayro escribió
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.
Jose Ramon Pernia Reyes escribió
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.
urpiano escribió
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.
urpiano escribió
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
shayro escribió
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.
TommyX escribió
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 !
adriana escribió
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
urpiano escribió
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
Alfredo escribió
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.