【问题标题】:Why will PsExec not execute a .ps1 script remotely?为什么 PsExec 不会远程执行 .ps1 脚本?
【发布时间】: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


【解决方案1】:

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

同时检查这个问题:Run PowerShell on remote PC

【讨论】:

  • 是的,我想这就是我在这里所做的。启动 PowerShell 并设置一次性使用的执行策略。 \\network\directory\subdirectory\psexec.exe -accepteula \\$IP -u domain\$username -h PowerShell -ExecutionPolicy Bypass -Command \\network\directory\sub-directory\diskSpaceCheck.ps1
【解决方案2】:

我想通了。脚本正在运行,但它只是坐在那里等待另一个命令。我在远程运行的脚本中添加了一个停止进程命令。

Stop-Process -Name powershell

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    相关资源
    最近更新 更多