好吧,我试图解决这个问题,但是现在是时候问互联网了。我想知道这是一个错误还是什么。
我正在尝试针对多台计算机启动作业,以确定哪些数据库名称驻留在它们上面。
我的计算机1系统设置为:Powershell 2.0,Windows 2k3 Enterprise x64
在Computer1上我可以运行:
Start-Job -scriptblock {gwmi -query "select * from win32_computersystem" -ComputerName "Computer2"}
这项工作将永远陷入“奔跑”状态。但是如果我在shell中的作业脚本块之外运行相同的命令,那就不行了。
我已尝试使用本地管理员(与我的域名)凭据进行此确切设置here,但结果相同。由于某种原因,它对我不起作用。
我已经尝试构建一个不使用gwmi的自定义WMI dotnet对象,但我得到了相同的结果!
-asjob参数?: 这不是解决方案。
使用此参数时,powershell窗口崩溃在12GB系统上使用的大约2GB内存;虽然我可以毫无问题地使用12GB的启动作业。我不妨以串行方式运行每个查询。
此外,在Gwmi上使用-Asjob参数时,永远不会回收内存,因此无法继续进一步的作业;即使在运行“remove-job * -force”或“[GC] :: Collect()”之后,powershell.exe的内存消耗仍然保持不变(再次,与start-job不同)。
由于SQL实例名称不同,因此wmi类名称会有所不同。所以我需要针对多个类运行多个查询命令。虽然技术上可行,但它更复杂,并且考虑到上述内存要求,限制为2GB。我希望有人能够知道如何开始工作。
所以我唯一没想过的就是我必须指定权限参数?
答案 0 :(得分:0)
我使用Invoke-Command -asJob:
PS C:\> Invoke-Command -ComputerName "WM2008R2ENT" -ScriptBlock {gwmi -query "select * from win32_computesystem"} -AsJob
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Running True wm2008r2ent gwmi -query "select * ...
PS C:\> Get-Job
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Completed True wm2008r2ent gwmi -query "select * ...
PS C:\Développements> Receive-Job 1
Domain : dom.fr
Manufacturer : VMware, Inc.
Model : VMware Virtual Platform
Name : WM2008R2ENT
PrimaryOwnerName : Utilisateur Windows
TotalPhysicalMemory : 683139072
PSComputerName : wm2008r2ent
您可以用机器列表替换机器名称。不要尝试在脚本块中使用的CmdLets中再次编写'-Computername。
(编辑)的 我试试你的命令行,它适用于我从客户端Windows 7(64位)到W2K3(32位)
我的客户端不在服务器的域中,我使用域管理员凭据。
您是否从32位Powershell或64位Powershell进行了测试?
您是否尝试在远程计算机上停止WMI服务并清理WMI数据库,当您在WMI服务器上进行过多测试时(例如,使用事件),它有时是合适的。