【发布时间】:2016-04-25 21:39:37
【问题描述】:
我正在尝试在 PowerShell 中编写一个脚本,该脚本收集 C: 驱动器上的可用空间,然后将其附加到网络驱动器上的 .csv 文件中。
我们公司默认没有启用 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 语句,但我在没有 if 测试的情况下尝试过它并得到了相同的结果。我不知道为什么远程机器不会执行这个脚本。我有另一个脚本被复制到这些机器上,然后以正常工作的相同方式执行。
此外,目标机器被锁定以限制它们仅用于特定目的。这些机器使用通用自动登录,通常可以访问一些应用程序。其他所有内容都无法访问,包括 Windows 资源管理器、控制面板等。我在办公室本地的一些机器上测试了这个脚本,它运行良好。
我在想可能是网络延迟问题?这会影响 PsExec 或 .ps1 脚本吗?我可以远程到机器上,注销,使用我的凭据登录并运行脚本,而 PsExec 只是坐在运行我给它的命令。
任何建议将不胜感激。
【问题讨论】:
-
我知道 PowerShell 远程处理未启用,但您可以远程使用 WMI 吗?
Get-WmiObject Win32_LogicalDisk -Filter "DeviceID='C:'" -ComputerName $server -
不,它失败,访问被拒绝 0x80070005。我可以使用 psexec \\IP -u domain\username -h wmic logicaldisk get size,freespace,caption。
标签: powershell