问题描述
我创建了一个.ps1脚本来监视我们的客户,它的工作原理就像一个魅力。不幸的是,执行该命令时始终会弹出一个powershell窗口,因此我将其包装到一个.vbs脚本中,该脚本与wscript一起执行,并使用GPO中的计划任务每天运行。当我手动执行脚本时,ps1文件和vbs文件都可以工作,但是无法在GPO中工作。除了映射的驱动器之外,其他所有东西的行为都应该正常。
当运行.ps1文件时,代码被截断了:
$Network_Drive=(Get-SMBMapping | Select-Object -expand RemotePath) -join "`r`n,"
$Network_Drive | Out-File \\a\b\c.csv
也可以:
$Network_Drive= (Get-CimInstance -Class Win32_NetworkConnection | Select -ExpandProperty RemoteName) -join "`r`n,"
vbs脚本:
command = "powershell.exe -nologo -ExecutionPolicy Unrestricted -File \\network\link\to\the\script.ps1"
set shell = CreateObject("WScript.Shell")
shell.Run command,0
预期结果:
,\\mapped\drive1\,\\mapped\drive2\
结果:
,
我不确定这是否是组策略的权限,还是应该使用其他方法。当我不使用.vbs而是直接使用ps1文件时,一切正常。网络打印机按预期显示。
解决方法
第一个问题是:为什么需要VBScript WSH脚本?
如果目标是从VBScript脚本中获取已映射驱动器的列表,则无需对PowerShell进行外壳安装并执行输出解析。而是直接在WSH脚本中使用WshNetwork
对象。示例:
Dim WshNetwork
Set WshNetwork = CreateObject("WScript.Network")
Dim Output
Output = ""
Dim Drives,I
Set Drives = WshNetwork.EnumNetworkDrives()
For I = 0 To Drives.Count - 1 Step 2
If Output = "" Then
Output = Drives.Item(I) & " => " & Drives.Item(I + 1)
Else
Output = Output & vbNewLine & Drives.Item(I) & " => " & Drives.Item(I + 1)
End If
Next
WScript.Echo Output
但再次:为什么需要WSH VBScript脚本?
,我通过将脚本放在客户端而不是共享驱动器上解决了我的问题。