2016-04-23 2 views
1

Я пытаюсь написать сценарий в PowerShell, который собирает свободное место на диске C: и затем добавляет его в CSV-файл на сетевом диске.Почему PsExec не будет выполнять сценарий .ps1 удаленно?

Наша компания не имеет разрешения PowerShell по умолчанию. Команды Remote PowerShell ограничены. Из-за этого мне приходится записывать вещи, а затем пинать их с помощью PsExec.

У меня есть два сценария для этого процесса. Первый из них - это тот, который я запускаю с моей машины, этот скрипт запрашивает мои учетные данные, а затем использует цикл foreach для циклического перехода через .txt-файл с IP-адресами, в которых каждый IP запускает второй скрипт с сетевого диска. Второй скрипт собирает свободное пространство, выполняет на нем математическую функцию, затем добавляет имя хоста и свободное пространство в CSV-файл в сети.

Однако второй скрипт никогда не запускается. После установления соединения с помощью PsExec моя консоль просто сидит там. Он должен запустить сценарий, а затем снова перейти к следующему IP-адресу. Я тестировал второй скрипт вручную на некоторых целевых компьютерах без проблем.

Локально выполняется скрипт:

$username = Read-Host "Username" 

$outputPath = "\\network\directory\sub-directory\FileName.csv" 
$IPpath = Read-Host "Enter the path for the list of IP addresses" 
$IPs = Get-Content -Path $IPpath 
Add-Content -Path $outputPath -Value """IP"",""Free Space""" 

foreach ($IP in $IPs) 
{ 
    if (Test-Connection -Count 1 -ComputerName $IP -Quiet) 
    { 
     \\network\directory\subdirectory\psexec.exe -accepteula \\$IP -u domain\$username -h PowerShell -ExecutionPolicy Bypass -Command \\network\directory\sub-directory\diskSpaceCheck.ps1 
    } 
    else 
    { 
     Add-Content -Path $outputPath -Value """$IP"",""Offline""" 
    } 
} 

Дистанционно выполняется скрипт (diskSpaceCheck.ps1):

$outputPath = "\\network\directory\sub-directory\FreeSpace.csv" 
$hostname = hostname 

$disk = Get-WmiObject Win32_LogicalDisk -Filter "DeviceID='C:'" 
$freeSpace = [System.Math]::Round((($disk.FreeSpace)/1GB)) 
Add-Content -Path $outputPath -Value "$($hostname), $($freeSpace)" 

Я не думаю, что вы можете иметь, если заявление внутри Еогеасп также, но я имею попробовал его без теста if и получил те же результаты. Я не могу понять, почему удаленный компьютер не выполнит этот скрипт. У меня есть другой скрипт, который копируется на эти машины, а затем выполняется таким же образом, который работает правильно.

Кроме того, целевые машины заблокированы для ограничения их использования только для конкретных целей. Эти машины используют общий автоматический вход в систему и обычно имеют доступ к нескольким приложениям. Все остальное недоступно, включая Проводник Windows, Панель управления и т. Д. Я тестировал этот скрипт на некоторых локальных компьютерах в моем офисе, и он работал нормально.

Я думал, может быть, проблема сетевой латентности? Может ли это повлиять на скрипты PsExec или .ps1? Я могу удалиться на машине, выйти, войти в систему с моими учетными данными и запустить сценарий, в то время как PsExec просто сидит при запуске команды, которую я ей дал.

Любые советы будут оценены.

+0

Я получаю, что дистанционное управление PowerShell не включено, но можете ли вы использовать WMI удаленно? 'Get-WmiObject Win32_LogicalDisk -Filter" DeviceID = 'C:' "-ComputerName $ server' – Matt

+0

Нет, сбой отказался 0x80070005. Я могу использовать psexec \\ IP -u domain \ username -h wmic logicaldisk получить размер, freespace, подпись. – oiad462

ответ

1

Это может произойти, если вы используете PSExec для непосредственного выполнения файла Ps1. Вместо этого используйте PSexec для запуска PowerShell.exe и передайте файл ps1 в качестве параметра.

Также проверьте этот вопрос: Run PowerShell on remote PC

+0

Да, я думаю, что это то, что я здесь делаю. Запуск PowerShell и установка политики выполнения для одноразового использования. \\ network \ directory \ подкаталог \ psexec.exe -accepteula \\ $ IP -u domain \ $ username -h PowerShell -ExecutionPolicy Bypass -Command \\ network \ directory \ subs-directory \ diskSpaceCheck.ps1 – oiad462

0

Я понял это. Скрипт работал, но он просто сидел там, ожидая еще одной команды. Я добавил команду остановки процесса для сценария, который запускается удаленно.

Stop-Process -Name powershell 

Теперь он запускается, а затем выходит с кодом ошибки -1.

Смежные вопросы