2
votes

Alright, I've tried to figure this out, but figured it's time to ask the interwebs. I'm wondering if this is a bug or what.

I'm trying to start jobs against multiple computers to determine which database names reside on them.

My Computer1 system setup is: Powershell 2.0, Windows 2k3 Enterprise x64

On Computer1 I can run:

Start-Job -scriptblock {gwmi -query "select * from win32_computersystem" -ComputerName "Computer2"}

And the job will be stuck in a state of "Running" forever. But not if I run the same command outside the job's script block in the shell.

I've tried this exact setup here with a local admin's (vs my domain) credentials, but same result. It doesn't work for me for some reason.

I've tried building a custom WMI dotnet object that doesn't use gwmi, but I get the same result!

The -asjob parameter?: This is not a solution.

  1. When using this parameter, the powershell window crashes at around 2GB memory used on a 12GB system; Whereas I can use start-job all the way to 12GB without problems. I might as well run every query in serial fashion.

  2. Also, memory is never reclaimed when using the -Asjob parameter on Gwmi, so no further jobs can continue; even after running "remove-job * -force" or "[GC]::Collect()", the memory consumption for powershell.exe stubbornly remains the same (again, unlike start-job).

  3. Since SQL instance names vary, the wmi class names vary. So I need to run multiple query commands against multiple classes. While is technically doable, its more complex and, given the above memory requirements, limited to 2gb. I'm hoping someone will just know how to make start-job work like it should.

So about the only thing I haven't tried is maybe I have to specify the authority parameter?

1
Start-Job is for running background jobs locally. I guess you mean (and actually use) Invoke-Command in your code example above?Torbjörn Bergstedt
Thanks for the comment. No, I don't mean invoke-command. Most of the computers I'm scanning don't have WinRM enabled, but they do have WMI enabled. I want to do a WMI query against a remote computer.Tom
I tried your example and the job completed successfully.JasonMArcher

1 Answers

0
votes

I use Invoke-Command -asJob for this :

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

You can replace the machine name by a list of machines. Don't try to code again '-Computername in the CmdLets you are using in the script block.


(Edited) I try you command line and it works for me from a client Windows Seven (64 Bits) to a W2K3 (32 bits)

My client is NOT in the domain of the server and I use domain admin credentials.

Have you made the test from a 32Bit Powershell or a 64 Bits Powershell ?

Do you try to stop WMI service on remote machine and clean the WMI database, it's sometime suitable when you made too much tests on a WMI server (with events for example).