Costelletes de PowerShell

Continuant amb la última entrada de com instal·lar un servidor Windows en mode core, introduïm unes quantes costelletes de com operar mitjançant la PowerShell per aixecar uns quants serveis.

Recordar que per iniciar una sessió de PowerShell en una instal·lació mode core, cal executar la instrucció:

start powershell

 

En equips amb entorn gràfic, cal iniciar l’aplicació Windows PowerShell del menú d’inici.

En aquesta entrada es troba:

 

Perfil de xarxa

Un cop desplegat el servidor i sense haver-lo unit a cap domini, és possible que el perfil de la xarxa (domini, privat o públic) no sigui el correcte, més aviat que estigui en el perfil públic. En aquest cas estarà bloquejant tots els accessos des de la xarxa al servidor.

Per visualitzar la configuració actual:

Get-NetConnectionProfile

Per canviar la configuració del perfil de xarxa d’una interfície (la 3 corresponent a la xarxa Network) a privat, per exemple:

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

Els valors que corresponen al paràmetre NetworkCategory per indicar el tipus de xarxa a la què pertany són:

  • Pertany a un domini: DomainAuthenticated
  • És una xarxa privada: Private
  • És una xarxa pública: Public

PowerShell canviar perfil de xarxa

 

Habilitar connexió per Escriptori Remot

Avui en dia, normalment, ja no es treballa davant la pantalla del servidor sinó que tot es fa per connexions remotes. El fet de tenir un servidor en entorn core no ha de ser pas diferent. Per habilitar la connexió per escriptori remot cal executar la següent comanda per habilitar l’accés de clients:

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

Però també cal modificar el tallafocs perquè permeti les connexions pel port TCP 3389. Comprovar l’estat de les regles predeterminades referents a l’escriptori remot:

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

S’ha de comprovar el paràmetre Enabled, que per defecte tindrà el valor FALSE. Com que hi ha més d’una regla a tocar i no tinc masses ganes de treballar, passaré una sola línia per canviar el valor d’aquest paràmetre a TRUE, sempre i quan la regla correspongui al perfil de xarxa PRIVAT.

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

Per entendre una mica el què fa la llonganissa anterior, no us deixaré amb la paraula a la boca:

  • Get-NetFirewallRule -DisplayName “*remote desktop – User*” Mostra totes les regles del tallafocs en què el seu nom contingui la frase “remote desktop – User” que equival a les regles que permeten la connexió per escriptori remot dels usuaris.
  • |Where-Object {$_.Profile -like “*Private*”} S’encadena a la instrucció anterior amb el símbol | (AltGr i la tecla 1). El què fa és filtrar la llista de la instrucció anterior perquè només seleccioni les regles que en el seu perfil (Profile) contenen la paraula Private. Habilitant només l’accés per escriptori remot quan l’equip tingui el perfil de xarxa Private o Domain, i no quan tingui un perfil públic.
  • |Set-NetFirewallRule -Enabled True També com instrucció encadenada, agafa totes les regles de la llista anterior (la que s’obté filtrada per remote desktop… i perfil de xarxa private) i li canvia el valor del paràmetre Enabled a True, habilitant d’aquesta forma la regla perquè permeti el trànsit per aquestes regles. En cas de voler tornar a bloquejar el trànsit, només cal canviar el valor True per False.

Es pot visualitzar en forma de taula l’estat de les regles:

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

PowerShell visualitzant l'estat de les regles del tallafocs

Ja es pot provar la connexió d’escriptori remot des d’un equip client com a qualsevol altre servidor. Però atenció! no espereu trobar tot l’entorn gràfic, en el seu lloc trobareu la mateixa consola de comandes que heu estat veient fins ara en el propi servidor (estem treballant amb un servidor core, recordeu).

 

Habilitar connexió remota per PowerShell

No tot és l’entorn gràfic en Windows, si, és pot accedir remotament a la PowerShell del servidor. Com? Doncs amb uns quants passos. Primer cal habilitar l’accés a PowerShell remota:

Enable-PSRemoting -force

PowerShell habilitant la PowerShell remota

Ara, a l’equip client des d’on ens volem connectar al servidor, cal especificar el servidor com un amfitrió de confiança per a connectar-s’hi. La següent instrucció especifica que qualsevol equip serà de confiança i d’aquesta forma li permetrà la connexió.

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

Com que és una mica exagerat permetre les connexions a tots, polim una mica la instrucció anterior concretant l’adreça IP i el nom del servidor on ens connectarem remotament per PowerShell.

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

Perquè tinguin efectes els canvis s’ha de reiniciar el servei de Windows Remote Management (WinRM):

Restart-Service WinRM

Abans d’establir la connexió, podem comprovar que tot és correcte amb la comanda:

Test-WsMan NOM_EQUIP

On Nom_Equip, com bé indica el seu nom, correspon a l’equip o adreça IP on ens volem connectar remotament. Ens ha de retornar una cosa semblant a la que mostra la imatge. En aquest cas, he fet la prova amb un equip que es diu JARVIS.

PowerShell provant la connexió remota a un equip

Ja es pot fer la connexió remota de PowerShell, indicant el nom de l’equip (NOM_EQUIP) on connectar-se i les credencials d’un usuari amb permisos (CREDENCIALS), formades pel nom de l’equip o domini i l’usuari (JARVIS\Administrator) per fer-ho:

Enter-PSSession -ComputerName NOM_EQUIP -Credential CREDENCIALS

Seguint l’exemple seria:

Enter-PSSession -ComputerName JARVIS -Credential JARVIS\Administrator

Un cop validem la instrucció, ens apareix el quadre de diàleg de Windows demanant la contrasenya de les credencials introduïdes.

PowerShell establint la connexió remota al servidor

Comprovat l’usuari, s’estableix la connexió de PowerShell amb el servidor remot. Es pot diferenciar de la local perquè l’intèrpret de comandes de PowerShell (PS) comença pel nom de l’equip remot entre claudàtors.

PowerShell connexió al servidor remot establerta

A partir d’aquest moment les instruccions que introduïm s’executen en el servidor remot fins que no tanquem la sessió amb un simple:

exit

Tornant a l’intèrpret de comandes de PowerShell de la màquina local.

PowerShell connectat a un equip remot

L’altre opció d’executar comandes en un equip remot, però sense connectar a la PowerShell sinó recuperar els resultats a la consola local és amb la instrucció:

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

En el paràmetre ScriptBlock, entre claus, s’especifiquen les instruccions separades per un ; a executar a l’equip remot.

Seguint l’exemple, per llistar el contingut de l’arrel de la unitat C:\ i que al final indiqui el nom del servidor, la instrucció seria:

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

PowerShell executant una instrucció remotament

 

Creació d’usuaris i grups de seguretat per PowerShell

Un pèl més complicat que tot l’anterior és la creació d’usuaris i grups de seguretat. Cal crear un objecte que representi l’ordinador i assignar-lo a una variable:

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

Un cop tenim l’objecte de l’equip, per crear un usuari, s’ha de crear un objecte que relacioni el nou usuari amb l’equip ($Equip):

$Usuari = $Equip.Create("User","NOM_DEL_USUARI")
$Usuari.SetPassword("Contrasenya")
$Usuari.SetInfo()
$Usuari.FullName ="NOM_DEL_USUARI_COMPLET"
$Usuari.SetInfo()

Analitzant les comandes una a una:

$Usuari = $Equip.Create(“User”,”NOM_DEL_USUARI”) crea l’objecte $Usuari que li assigna un usuari (User) nou (NOM_DEL_USUARI) a l’equip local $Equip.

$Usuari.SetPassword(“Contrasenya”) estableix una nova contrasenya per l’usuari que s’està creant. S’apliquen les polítiques de contrasenyes, si la nova contrasenya no les compleix donarà un error al respecte.

$Usuari.SetInfo() escriu els canvis que s’han fet a l’objecte $Usuari, ja sigui a l’equip o al Active Directory, depenent d’on s’estigui creant l’usuari.

$Usuari.FullName = “NOM_DEL_USUARI_COMPLET” Especifica el nom llarg de l’usuari.

$Usuari.SetInfo() escriu els canvis fets, afegir el nom complet de l’usuari.

Per visualitzar els usuaris locals de l’equip, fent una consulta filtrada als objectes de l’equip s’obté el llistat:

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

Per visualitzar les propietats d’un usuari concret, assignant l’usuari a una nova variable:

$UsuariJMSolanes = $Equip.Children |Where-Object {$_.Name -eq 'jmsolanes'}

S’obtenen tots els seus atributs possibles, per exemple:

  • $UsuariJMSolanes.FullName nom complet de l’usuari.
  • $UsuariJMSolanes.LastLogin la data de l’últim inici de sessió.
  • $UsuariJMSolanes.HomeDirectory la ubicació de la carpeta personal assignada a l’usuari.

En cas de voler-los canviar, només cal fer un = amb el nou valor i després executar la instrucció .SetInfo() per guardar els canvis.

 

Si el que es vol és crear un Grup de Seguretat, un cop tenim l’objecte de l’equip ($Equip), s’ha de crear un objecte que relacioni el nou grup de seguretat amb l’equip:

$GrupSeguretat = $Equip.Create("Group","NOM_GRUP_DE_SEGURETAT")
$GrupSeguretat.SetInfo()
$GrupSeguretat.Description="Descripció del grup de seguretat"
$GrupSeguretat.SetInfo()

Analitzant les comandes una a una:

$GrupSeguretat = $Equip.Create(“Group”,”NOM_GRUP_DE_SEGURETAT”) crea l’objecte $GrupSeguretat que li assigna un grup (Group) nou (NOM_GRUP_DE_SEGURETAT) a l’equip local $Equip (sempre ha de crear primer aquest objecte).

$GrupSeguretat.SetInfo() a l’igual que per l’usuari, és l’encarregat d’escriure els canvis a l’equip o Active Directory.

$GrupSeguretat.Description=”Descripció del grup de seguretat” estableix una descripció pel grup de seguretat.

$GrupSeguretat.SetInfo() escriu els canvis fets, afegir una descripció al grup de seguretat.

Per visualitzar els grups de seguretat locals de l’equip, a l’igual que pels usuaris, fent una consulta filtrada als objectes de l’equip s’obté el llistat:

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

 

Per assignar un usuari a un grup de seguretat, les instruccions serien:

$Grup = [ADSI]"WinNT://./NOM_GRUP_DE_SEGURETAT,group"
$Grup.Add("WinNT://NOM_DEL_USUARI,user")

Analitzant les comandes una a una:

$Grup = [ADSI]”WinNT://./NOM_GRUP_DE_SEGURETAT,group” Crea un objecte amb el grup de seguretat.

$Grup.Add(“WinNT://NOM_DEL_USUARI,user”) Afegeix l’usuari a l’objecte que conté el grup de seguretat.

 

Per eliminar un usuari d’un grup de seguretat, les instruccions serien:

$Grup = [ADSI]"WinNT://./NOM_GRUP_DE_SEGURETAT,group"
$Grup.Remove("WinNT://NOM_DEL_USUARI,user")

Analitzant les comandes una a una:

$Grup = [ADSI]”WinNT://./NOM_GRUP_DE_SEGURETAT,group” Crea un objecte amb el grup de seguretat.
$Grup.Remove(“WinNT://NOM_DEL_USUARI,user”) Elimina l’usuari de l’objecte que conté el grup de seguretat.

 

T’ha agradat l’article? El pots compartir a les xarxes socials. També pots deixar la teva opinió, comentari o suggeriment. Gràcies!

Similar Posts by The Author: