Running commands on remote computers from Powershell
A cam trecut vremea de cand singura varianta ca sa rulezi ceva pe un sistem remote se facea prin PSEXEC. In ultimii ani am folosit Powershell si PS Remoting pentru astfel de activitati insa as vrea azi sa prezint si cum se face plus o alternativa in caz ca Powershell Remoting nu este activat sau accesati sisteme mai vechi.
Prima data e util sa stiti cum sa testati daca sistemul remote are activat Powershell Remoting. Prima data puteti incerca sa verificati daca sistemul remote este online prin Test-NetConnection. Iar apoi o alta verificare partiala se poate face prin comanda Test-WSMan.
Daca returneaza eroare (si automat $False) atunci WinRM nu este activat si automat nici PS Remoting nu o sa mearga. Dar daca este activat atunci puteti incerca sa rulati o comanda remote folosind Invoke-Command. Si daca rezultatul va fi $False atunci probabil nu aveti drepturile necesare si colectati mesajul de eroare.
Invoke-Command functioneaza cam asa: Invoke-Command –ComputerName NumeleServerului {scriptblock}. In scriptblock puteti pune efectiv un script; o serie de comenzi despartite prin punct si virgula.
Iar in exemplul de mai jos am luat un caz simplu in care trebuie sa cream doua foldere pe sistemul remote. In exemplul asta trimitem si niste parametri catre comanda MKDIR din acel scriptblock. Vedeti mai jos cum se foloseste –ArgumentList (este un array, ce apoi il accesati din interiorul acoladelor).
Suficient pana aici ca sa va faceti o idee. Sunt multe de spus dar nu o sa mai dezvolt. in schimb o sa mai prezint o varianta prin care puteti executa aceasta operatiune si fara Powershell remoting.
Daca va mai aduceti aminte si prin WMI exista o clasa numita Win32_Process ce poate instanta procese remote. Iar cu Invoke-WmiMethod puteti face asta remote:
De data asta ArgumentList este diferit si aici punem de fapt procesul sau comanda ce vrem sa ruleze remote. Doar ca de exemplu, pentru ca MKDIR sa ruleze, acesta trebuie sa fie in contextul unui command prompt. Asa ca va trebui sa il rulati cu CMD /C. In cazul de mai sus numele folderului il puteti in locui cu o variabila locala (in primul exemplu cu Invoke-Command nu merge si trebuie sa folositi –ArgumentList).
Mai greu va fi sa colectati erorile in caz ca ceva nu merge. ReturnValue va fi 0 chiar si daca MKDIR va esua. Asta pentru ca win32_process a reusit sa porneasca CMD.EXE dar mai departe nu are vizibilitate daca a si mers comanda.
Sper sa va fie utila infomatia de mai sus.