Remote Powershell
Guten Morgen zusammen,
ich bin grade dabei ein Script zu basteln mit dem ich an allen Rechnern in der Domain eine WMI Abfrage nach einer Webcam machen kann. Das Script soll die Rechner aus der Rechnerliste.txt einlesen und dann nach erfolgreichem auslesen eine .TXT Datei mit dem Computername lokal auf C:\Powershell\ abspeichern.
Hat jemand eine Idee wieso es nicht funktioniert?
ich bin grade dabei ein Script zu basteln mit dem ich an allen Rechnern in der Domain eine WMI Abfrage nach einer Webcam machen kann. Das Script soll die Rechner aus der Rechnerliste.txt einlesen und dann nach erfolgreichem auslesen eine .TXT Datei mit dem Computername lokal auf C:\Powershell\ abspeichern.
Hat jemand eine Idee wieso es nicht funktioniert?
$cred = Get-Credential -Message "Bitte geben Sie Nutzername und Passwort ein."
$PCList = Get-Content 'C:\Powershell\Rechnerliste.txt'
foreach ($computer in $PCList) {
# Anzeige nicht erreichbarer Rechner mit Speicherung in Lokaler TXT-Datei
if(!(Test-Connection -Cn $computer -Count 1 -quiet)) { Out-File C:\Powershell\Fehler.txt -Append -InputObject $computer -width 50 }
# Wenn Ping Erfolgreich wird Installation und Skript ausgeführt
if((Test-Connection -Cn $computer -Count 1 -quiet)) {
#Dienst WinRM remote starten
Set-Service -ComputerName $computer -Name WinRM -Status Running
# Aufbau der Verbindung zu den Remoterechnern
Invoke-Command -ComputerName $computer -Credential $cred {
# Erteilung der Berechtigung auf den Remoterechnen
Set-ExecutionPolicy Bypass -Force
# Script
Get-CimInstance Win32_PnPEntity | where caption -match 'Webcam' | Out-File -FilePath C:\Powershell\$env:COMPUTERNAME.txt
}
}
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 665260
Url: https://administrator.de/forum/remote-powershell-665260.html
Ausgedruckt am: 06.04.2025 um 21:04 Uhr
10 Kommentare
Neuester Kommentar
Versuchs mal so in der Art:
(nicht getestet!)
...
$ScriptBlock =
{
Set-ExecutionPolicy Bypass -Force
Get-CimInstance Win32_PnPEntity | where caption -match 'Webcam'
}
foreach ($computer in $PCList) {
Invoke-Command -Computername $computer -ScriptBlock $ScriptBlock | Out-File -FilePath C:\Powershell\$computer.txt
}
...
Output ist in dem Fall direkt in der Console
Oder mit Output als Datei
$PCList = Get-Content -path 'C:\Powershell\Rechnerliste.txt'
$ScriptBlock =
{
Set-ExecutionPolicy Bypass -Force
Get-CimInstance Win32_PnPEntity | where caption -match 'Webcam'
try{
"{0}`t{1} Webcam vorhanden" -f (Get-Date).ToString(), $env:COMPUTERNAME
}
catch {
"{0}`t{1} Webcam nicht vorhanden" -f (Get-Date).ToString(), $env:COMPUTERNAME
}
}
foreach ($computer in $PCList) {
Invoke-Command -Computername $computer -ScriptBlock $ScriptBlock
}
Oder mit Output als Datei
$PCList = Get-Content -path 'C:\Powershell\Rechnerliste.txt'
$ScriptBlock =
{
Set-ExecutionPolicy Bypass -Force
Get-CimInstance Win32_PnPEntity | where caption -match 'Webcam'
try{
"{0}`t{1} webcam vorhanden" -f (Get-Date).ToString(), $env:COMPUTERNAME
}
catch {
"{0}`t{1} webcam nicht vorhanden" -f (Get-Date).ToString(), $env:COMPUTERNAME
}
}
foreach ($computer in $PCList) {
$result = Invoke-Command -Computername $computer -ScriptBlock $ScriptBlock
}
$result | Where-Object { $_ -match 'vorhanden' } | Add-Content -Path 'C:\Powershell\vorhanden.txt' -PassThru
$result | Where-Object { $_ -match 'nicht vorhanden' } | Add-Content -Path 'C:\Powershell\nicht vorhanden.txt' -PassThru
Bist du denn Admin auf der remote Kiste? Wie hast du das Skript als Admin aufgerufen? Als .ps1 abgespeichert?
Kopiere mal folgendes an den Anfang deines Skripts, somit rufst du es auch unter dem Admin Account auf.
Den Service auf dem remote PC extra zu starten ist nicht nötig. mit winrm -quickconfig in deinem Invoke-command kannst du das ebenfalls erledigen, und das sogar zuverlässiger.
Hast du denn mein Skript mal durchlaufen lassen?
Kopiere mal folgendes an den Anfang deines Skripts, somit rufst du es auch unter dem Admin Account auf.
param([switch]$Elevated)
function Test-Admin {
$currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
$currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}
if ((Test-Admin) -eq $false) {
if ($elevated) {
# tried to elevate, did not work, aborting
} else {
Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
}
exit
}
write-host "running with full privileges" -foreground "green"
Den Service auf dem remote PC extra zu starten ist nicht nötig. mit winrm -quickconfig in deinem Invoke-command kannst du das ebenfalls erledigen, und das sogar zuverlässiger.
Hast du denn mein Skript mal durchlaufen lassen?
Moin,
Den Service jedes mal zu starten ist aber dennoch überflüssig. Einmal auf den Clients auf Autostart setzen und gut ist.
Gruß Thomas
Zitat von @chkdsk:
Den Service auf dem remote PC extra zu starten ist nicht nötig. mit winrm -quickconfig in deinem Invoke-command kannst du das ebenfalls erledigen, und das sogar zuverlässiger.
Wenn WinRM nicht läuft, funktioniert Invoke-Command erst gar nicht.Den Service auf dem remote PC extra zu starten ist nicht nötig. mit winrm -quickconfig in deinem Invoke-command kannst du das ebenfalls erledigen, und das sogar zuverlässiger.
Den Service jedes mal zu starten ist aber dennoch überflüssig. Einmal auf den Clients auf Autostart setzen und gut ist.
Set-Service -Name WinRM -StartupType Automatic
Gruß Thomas