2016-04-23 60 views
1

我正在尝试在PowerShell中编写一个脚本,该脚本收集C:驱动器上的可用空间,然后将其附加到网络驱动器上的.csv文件中。为什么PsExec不能远程执行.ps1脚本?

我们公司没有默认启用PowerShell。远程PowerShell命令受到限制。因此,我必须编写脚本,然后使用PsExec将它们踢出去。

我有这个过程的两个脚本。第一个是我从机器上运行的,这个脚本要求输入我的凭据,然后使用foreach循环来循环访问IP地址的.txt文件,告诉每个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)" 

我不认为你可以有一个,如果一个foreach语句里面也不过我已经尝试没有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获取大小,可用空间,标题。 – oiad462

回答

1

如果您使用PSExec直接执行Ps1文件,则会发生这种情况。而是使用PSexec来执行PowerShell.exe并将您的ps1文件作为参数传递。

也检查了这个问题:Run PowerShell on remote PC

+0

是的,我认为这是我在这里做的。启动PowerShell并设置一次性使用的执行策略。 \\ network \ directory \ subdirectory \ psexec.exe -accepteula \\ $ IP -u domain \ $ username -h PowerShell -ExecutionPolicy Bypass -Command \\ network \ directory \ sub-directory \ diskSpaceCheck.ps1 – oiad462

0

我想通了。脚本正在运行,但它只是坐在那里等待另一个命令。我向远程运行的脚本添加了stop-process命令。

Stop-Process -Name powershell 

现在,它开始运行,然后,错误代码退出-1。