Chuletillas de PowerShell

Continuando con la última entrada de como instalar un servidor Windows en modo core, introducimos unas cuantas chuletillas de como operar mediante la PowerShell para levantar unos cuantos servicios.

Recordar que para iniciar una sesión de PowerShell en una instalación modo core, hay que ejecutar la instrucción:

start powershell

En equipos con entorno gráfico, hay que iniciar la aplicación Windows PowerShell del menú de inicio. En esta entrada se encuentra:

 

Perfil de red

Una vez desplegado el servidor y sin haberlo unido a ningún dominio, es posible que el perfil de la red (dominio, privado o público) no sea el correcto, más bien que esté en el perfil público. En este caso estará bloqueando todos los accesos desde la red al servidor.

Para visualizar la configuración actual:

Get-NetConnectionProfile

Para cambiar la configuración del perfil de red de una interfaz (la 3 correspondiente a la red Network) a privado, por ejemplo:

Set-NetConnectionProfile -Name Network -InterfaceIndex 3 -NetworkCategory Private

Los valores que corresponden al parámetro NetworkCategory para indicar el tipo de red a la que pertenece son:

  • Pertenece a un dominio: DomainAuthenticated
  • Es una red privada: Private
  • Es una red pública: Public

PowerShell canviar perfil de xarxa

Habilitar conexión para Escritorio Remoto

Hoy en día, normalmente, ya no se trabaja delante de la pantalla del servidor sino que todo se hace por conexiones remotas. El hecho de tener un servidor en entorno core no tiene porque ser diferente. Para habilitar la conexión para escritorio remoto hay que ejecutar el siguiente comando para habilitar el acceso de clientes:

cscript c:\Windows\System32\SCregEdit.wsf /ar 0

Pero también hay que modificar el cortafuegos para que permita las conexiones por el puerto TCP 3389. Comprobar el estado de las reglas predeterminadas referentes al escritorio remoto:

Get-NetFirewallRule -DisplayName "*remote desktop - User*"

Se debe comprobar el parámetro Enabled, que por defecto tendrá el valor FALSE. Como que hay más de una regla a tocar y no tengo demasiadas ganas de trabajar, pasaré una sola línea para cambiar el valor de este parámetro a TRUE, siempre y cuando la regla corresponda al perfil de red PRIVADO.

Get-NetFirewallRule -DisplayName "*remote desktop - User*" |Where-Object {$_.Profile -like "*Private*"} | Set-NetFirewallRule -Enabled True

Para entender un poco lo que hace la parrafada anterior, no os dejaré con la palabra en la boca:

  • Get-NetFirewallRule -DisplayName “*remote desktop – User*” Muestra todas las reglas del cortafuegos en el que su nombre contenga la frase “remote desktop -User” que equivale a las reglas que permiten la conexión por escritorio remoto de los usuarios.
  • |Where-Object {$_.Profile -like “*Private*”} Se encadena a la instrucción anterior con el símbolo | (AltGr y la tecla 1). Lo que hace es filtrar la lista de la instrucción anterior para que sólo seleccione las reglas que en su perfil (Profile) contienen la palabra Private. Habilitando solo el acceso para escritorio remoto cuando el equipo tenga el perfil de red Private o Domain, y no cuando tenga un perfil público.
  • |Set-NetFirewallRule -Enabled True También como instrucción encadenada, coge todas las reglas de la lista anterior (la que se obtiene filtrada por remote desktop… y perfil de red private) y le cambia el valor del parámetro Enabled a True, habilitando de esta manera la regla porque permita el tráfico por estas reglas. En caso de querer volver a bloquear el tráfico, solo hay que cambiar el valor True por False.

Se puede visualizar en forma de tabla el estado de las reglas:

Get-NetFirewallRule -DisplayName "*remote desktop - User*" |Where-Object {$_.Profile -like "*Private*"} |ft DisplayName,Enabled

PowerShell visualitzant l'estat de les regles del tallafocs

Ya se puede probar la conexión de escritorio remoto desde un equipo cliente como en cualquier otro servidor. ¡Pero atención! no esperéis encontrar todo el entorno gráfico, en su lugar encontraréis la misma consola de comandos que habéis estado viendo hasta ahora en el propio servidor (estamos trabajando con un servidor core, recordad).

Habilitar conexión remota para PowerShell

No todo es el entorno gráfico en Windows, si, se puede acceder remotamente a la PowerShell del servidor. ¿Cómo? Pues con unos cuantos pasos. Primero hay que habilitar el acceso a PowerShell remota:

Enable-PSRemoting -force

PowerShell habilitant la PowerShell remota

Ahora, en el equipo cliente desde donde nos queremos conectar al servidor, hay que especificar el servidor como un anfitrión de confianza para conectarse. La siguiente instrucción especifica que cualquier equipo será de confianza y de esta manera le permitirá la conexión.

set-item wsman:\localhost\client\trustedhosts *

Como que es un poco exagerado permitir las conexiones a todos, pulimos un poco la instrucción anterior concretando la dirección IP y el nombre del servidor donde nos conectaremos remotamente por PowerShell.

set-item wsman:\localhost\client\trustedhosts "192.168.0.17,SERVIDORCORE"

Para que tengan efecto los cambios hay que reiniciar el servicio de Windows Remote Management (WinRM):

Restart-Service WinRM

Antes de establecer la conexión, podemos comprobar que todo está correcto con el comando:

Test-WsMan NOMBRE_EQUIPO

Donde Nombre_Equipo, como bien indica su nombre, corresponde al equipo o dirección IP donde nos queremos conectar remotamente. Nos debe devolver una cosa parecida a la que muestra la imagen. En este caso, he hecho la prueba con un equipo que se llama JARVIS.

PowerShell provant la connexió remota a un equip

Ya se puede hacer la conexión remota de PowerShell, indicando el nombre del equipo (NOMBRE_EQUIPO) donde conectarse y las credenciales de un usuario con permisos (CREDENCIALS), formadas por el nombre del equipo o dominio y el usuario (JARVIS\Administrador) para hacerlo:

Enter-PSSession -ComputerName NOMBRE_EQUIPO -Credential CREDENCIALS

Siguiendo el ejemplo sería:

Enter-PSSession -ComputerName JARVIS -Credential JARVIS\Administrator

Una vez validemos la instrucción, nos aparece el cuadro de diálogo de Windows pidiendo la contraseña de las credenciales introducidas.

PowerShell establint la connexió remota al servidor

Comprobado el usuario, se establece la conexión de PowerShell con el servidor remoto. Se puede diferenciar de la local porque el intérprete de comandos de PowerShell (PS) empieza por el nombre del equipo remoto entre corchetes.

PowerShell connexió al servidor remot establerta

A partir de este momento las instrucciones que introducimos se ejecutan en el servidor remoto hasta que no cerramos la sesión con un simple:

exit

Volviendo al intérprete de comandos de PowerShell de la máquina local.

PowerShell connectat a un equip remot

La otra opción de ejecutar comandos en un equipo remoto, pero sin conectar a la PowerShell sino recuperar los resultados en la consola local es con la instrucción:

Invoke-Command -ComputerName NOM_EQUIP -ScriptBlock { INSTRUCCIONS } -Credential CREDENCIALS

En el parámetro ScriptBlock, entre llaves, se especifican las instrucciones separadas por un ; a ejecutar en el equipo remoto.

Siguiendo el ejemplo, para listar el contenido de la raíz de la unidad C:\ y que al final indique el nombre del servidor, la instrucción sería:

Invoke-Command -ComputerName JARVIS -ScriptBlock { Get-ChildItem C:\ ; hostname } -Credential JARVIS\Administrator

PowerShell executant una instrucció remotament

Creación de usuarios y grupos de seguridad por PowerShell

Un poco más complicado que todo lo anterior es la creación de usuarios y grupos de seguridad. Hay que crear un objeto que represente el ordenador y asignarlo a una variable:

$Equipo = [ADSI]"WinNT://$Env:COMPUTERNAME,Computer"

Una vez tenemos el objeto del equipo, para crear un usuario, se ha de crear un objeto que relacione el nuevo usuario con el equipo ($Equipo):

$Usuario = $Equipo.Create("User","NOMBRE_DEL_USUARIO")
$Usuario.SetPassword("Contraseña")
$Usuario.SetInfo()
$Usuario.FullName ="NOMBRE_DEL_USUARIO_COMPLETO"
$Usuario.SetInfo()

Analizando los comandos uno a uno:

$Usuario = $Equipo.Create(“User”,”NOMBRE_DEL_USUARIO”) crea el objeto $Usuario que le asigna un usuario (User) nuevo (NOMBRE_DEL_USUARIO) en el equipo local $Equipo.

$Usuario.SetPassword(“Contraseña”) establece una nueva contraseña para el usuario que se está creando. Se aplican las políticas de contraseñas, si la nueva contraseña no las cumple dará un error al respecto.

$Usuario.SetInfo() escribe los cambios que se han hecho en el objeto $Usuario, ya sea en el equipo o en el Active Directory, dependiendo de donde se esté creando el usuario.

$Usuario.FullName = “NOMBRE_DEL_USUARIO_COMPLETO” Especifica el nombre largo del usuario.

$Usuario.SetInfo() escribe los cambios hechos, añadir el nombre completo del usuario.

Para visualizar los usuarios locales del equipo, haciendo una consulta filtrada a los objetos del equipo se obtiene el listado:

$Equipo.Children |Where-Object {$_.schemaclassname -eq 'user' } | ft Name, Description -Autosize

Para visualizar las propiedades de un usuario concreto, asignando el usuario a una nueva variable:

$UsuarioJMSolanes = $Equipo.Children |Where-Object {$_.Name -eq 'jmsolanes'}

Se obtienen todos sus atributos posibles, por ejemplo:

  • $UsuarioJMSolanes.FullName nombre completo del usuario.
  • $UsuarioJMSolanes.LastLogin la fecha del último inicio de sesión.
  • $UsuarioJMSolanes.HomeDirectory la ubicación de la carpeta personal asignada al usuario.

En caso de querer cambiarlos, solo hay que hacer un = con el nuevo valor y después ejecutar la instrucción .SetInfo() para guardar los cambios.

Si lo que se quiere es crear un Grupo de Seguridad, una vez tenemos el objeto del equipo ($Equipo), se debe crear un objeto que relacione el nuevo grupo de seguridad con el equipo:

$GrupoSeguridad = $Equipo.Create("Group","NOMBRE_GRUPO_DE_SEGURIDAD")
$GrupoSeguridad.SetInfo()
$GrupoSeguridad.Description="Descripción del grupo de seguridad"
$GrupoSeguridad.SetInfo()

Analizando los comandos uno a uno:

$GrupoSeguridad = $Equipo.Create(“Group”,”NOMBRE_GRUPO_DE_SEGURIDAD”) crea el objeto $GrupoSeguridad que le asigna un grupo (Group) nuevo (NOMBRE_GRUPO_DE_SEGURIDAD) al equipo local $Equipo (siempre se debe crear primero este objeto).

$GrupoSeguridad.SetInfo() al igual que para el usuario, es el encargado de escribir los cambios al equipo o Active Directory.

$GrupoSeguridad.Description=”Descripción del grupo de seguridad” establece una descripción para el grupo de seguridad.

$GrupoSeguridad.SetInfo() escribe los cambios hechos, añadir una descripción al grupo de seguridad.

Para visualizar los grupos de seguridad locales del equipo, al igual que para los usuarios, haciendo una consulta filtrada a los objetos del equipo se obtiene el listado:

$Equipo.Children |Where-Object {$_.schemaclassname -eq 'group' } | ft Name, Description -Autosize

Para asignar un usuario a un grupo de seguridad, las instrucciones serían:

$Grupo = [ADSI]"WinNT://./NOMBRE_GRUPO_DE_SEGURIDAD,group"
$Grupo.Add("WinNT://NOMBRE_DEL_USUARIO,user")

Analizando los comandos uno a uno:

$Grupo = [ADSI]”WinNT://./NOMBRE_GRUPO_DE_SEGURIDAD,group” Crea un objeto con el grupo de seguridad.

$Grupo.Add(“WinNT://NOMBRE_DEL_USUARIO,user”) Añade el usuario al objeto que contiene el grupo de seguridad.

  Para eliminar un usuario de un grupo de seguridad, las instrucciones serían:

$Grupo = [ADSI]"WinNT://./NOMBRE_GRUPO_DE_SEGURIDAD,group"
$Grupo.Remove("WinNT://NOMBRE_DEL_USUARIO,user")

Analizando los comandos uno a uno:

$Grupo = [ADSI]”WinNT://./NOMBRE_GRUPO_DE_SEGURIDAD,group” Crea un objeto con el grupo de seguridad. $Grupo.Remove(“WinNT://NOMBRE_DEL_USUARIO,user”) Elimina el usuario del objeto que contiene el grupo de seguridad.

  ¿Te ha gustado el artículo? Lo puedes compartir en las redes sociales. También puedes dejar tu opinión, comentario o sugerencia. ¡Gracias!

Similar Posts by The Author:

 

14 comentaris per a
“Chuletillas de PowerShell”

  1. Hola Estimado,
    Como pudo hacer si en mi pc de trabajo no tengo el archivo SCregEdit.ws, es decir no puedo ejecutar cscript c:\Windows\System32\SCregEdit.wsf /ar 0.

    Gracias por tu atención.

     
    1. El fichero scregedit.wsf se utiliza en la versión Windows Server, normalmente para la versión CORE. Este fichero no se encuentra, normalmente en las ediciones de escritorio Windows 7, 8 o 10. Desconozco si copiándolo de un servidor y poniéndolo en la estación funcionaria.

      Saludos.

       
  2. Hola, tengo un problema, tengo varios dominios y quiero consultar con powershell el dominio de un usuaro desde un dominio A para saber en que dominio esta: B, C o D.

     
  3. Buenas tardes Josep María.
    Me encanta tu blog y estoy aprendiendo mucho.
    No sé si esta tarea se puede realizar con GPOs (lo he intentado y no lo he logrado) o a través de PS.
    ¿Cómo puedo habilitar permisos de instalación temporales a usuarios del dominio (alumnos de un instituto) que no lo tienen? ¿Se puede realizar a través de GPO? Dispongo de un usuario que pertenece al grupo de Administradores y cuando hace falta, lo habilito y pueden instalar, aunque a veces no funciona ¿? ¿Se podría, bien mediante PS a esos usuarios o mediante GPO crear un usuario local, hacerlo miembro del grupo local Administradores y habilitarlo/deshabilitarlo con PS o GPO?
    Gracias por tu ayuda.

     
    1. Hola, difícil de contestar tu pregunta.
      Para instalar, en la mayoría de los casos, debes pertenecer al grupo de administradores locales de la máquina en cuestión. Como bien dices, dicho permiso se consigue añadiendo al usuario o un grupo de seguridad al grupo local de administradores. En el caso del usuario, cerrando la sesión y volviendo a abrir, basta para aplicar los cambios. En caso que sea un grupo de Active Directory, debes reiniciar el equipo.

      Por lo tanto, una solución rápida, seria tener creado un grupo de seguridad en el Active Directory que a la vez seria miembro de del grupo Administradores locales de todos los equipos. Esta parte la puedes hacer mediante una GPO.

      Cuando lo necesites, añades los usuarios al grupo de seguridad del Active Directory, deben cerrar y volver a abrir la sesión para aplicar los cambios del grupo y listos. Si quieres automatizar el añadir o quitar los usuarios del grupo de seguridad, lo puedes hacer por la PowerShell. Incluso programarlo para hacerlo antes de la clase y una vez finalizada la clase volverlos a sacar.

      Espero que esto te guie un poco,

      saludos.

       
  4. Hola Josep María, sabes si existe alguna manera de modificar las opciones de la pestaña “Entorno” dentro de los usuarios ? Donde le marcas para que lanze un programa directamente.

    Estoy mirando las opciones de Set-ADUser, pero creo que no tiene esa opcion.

    Tengo que modificar unos 50 usuarios y sería un detalle encontrarlo.

    Gracias y felicidades por el blog, lo consulto a menudo 😉

     
    1. Hola Manel,

      Me ha picado la curiosidad tu comentario y he estado buscando al respecto sin encontrar mucho al respecto. Había un script de PowerQuest que le he perdido la pista. Lo siento en este apartado.

      No obstante, si lo que necesitas es politizar los usuarios para este apartado tienes las GPOs, que aplicada a la OU de usuarios o filtrada por el grupo de seguridad donde tienes los usuarios de Escritorio remoto realizas esta configuración.

      Saludos,

       
  5. Hola Josep Maria,

    Voy a responderme a mi mismo sobre el tema… en principio no se puede… pero despues de mucho buscar he encontrado aquí (https://www.powershelladmin.com/wiki/Quest_ActiveRoles_Management_Shell_Download) un instalador que ofrece mas Cmdlets, entre ellos uno que es Set-QADUser en el que marcas facilmente los datos de -TsWorkDirectory, -TsInitialProgram, etc

    En esta otra web esta la referencia de Cmdlets disponibles (https://dmitrysotnikov.wordpress.com/2008/02/13/managing-terminal-services-attributes-with-powershell/)

    Saludos.

     
    1. Gracias por tu aportación Manel.

      Es cierto que el paquete de Quest daba extensiones de administración a la PowerShell pasando por caja. Ahora mismo no sé en qué estado está todo esto ya que lo acabo comprando Dell para finalmente destruirlo. Me apunto la URL con los cmdlets.

      Saludos,

       
  6. Hola Josema, actualmente estoy en el mundillo del Powershell y me esta resultando bastante interesante. Bueno en la organización donde trabajo, los equipos se len solos del dominio de trabajo, con lo cual me he propuesto a realizar un script el cual me permite a unir de nuevo un equipo al dominio por medio de la ip del equipo en remoto. como lo ves.. ? Saludos!!!

     
    1. Hola Leonardo,

      ¿Que los equipos salen del dominio? Es muy raro que te pase eso sin más, si se salen cuando pasan dias sin contactar con el controlador ya que no pueden renovar la contraseña de equipo, pero en un entorno en producción esto NO te debe pasar. Revisa bien la red.

      En cuanto ha volver a añadir el equipo al dominio tienes que tener en cuenta factores como qué pasa con la cuenta existente, si está; y que el usuario que lo vuelve a poner al dominio tiene que tener permisos para hacerlo. Recuerda que por defecto un usuario estándard puede poner 10 equipos en el dominio.

      Saludos,

       

Deixar un comentari

Recorda que no es contestaran preguntes personals, només d´interés comú que ens enriqueixin a tots.
La teva adreça de correu electrònic no serà publicada. Els camps obligatoris estan indicats.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.