【问题标题】:WMI Query Script as a JobWMI 查询脚本作为作业
【发布时间】:2011-03-17 04:27:34
【问题描述】:

我有两个脚本。一个以服务器列表作为参数调用另一个。第二个查询旨在执行 WMI 查询。当我手动运行它时,它完美地做到了这一点。当我尝试将其作为作业运行时,它会永远挂起,我必须将其删除。

为了篇幅,这里是调用脚本的相关部分:

ProcessServers.ps1

Start-Job -FilePath .\GetServerDetailsLight.ps1 -ArgumentList $sqlsrv,$destdb,$server,$instance

GetServerDetailsLight.ps1

param($sqlsrv,$destdb,$server,$instance)

$password = get-content C:\SQLPS\auth.txt | convertto-securestring
$credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist "DOMAIN\MYUSER",$password

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO')
$box_id = 0;

if ($sqlsrv.length -eq 0) {
write-output "No data passed"
break
}

function getinfo {
    param(
        [string]$svr,
        [string]$inst
        )
    "Entered GetInfo with: $svr,$inst"
    $cs = get-wmiobject win32_operatingsystem -computername $svr -credential $credentials -authentication 6 -Verbose -Debug | 
    select Name, Model, Manufacturer, Description, DNSHostName, Domain, DomainRole, PartOfDomain,
    NumberOfProcessors, SystemType, TotalPhysicalMemory, UserName, Workgroup
    write-output "WMI Results: $cs"
}
getinfo $server $instance
write-output "Complete"

作为作业执行,它将永远显示为“正在运行”:

PS C:\sqlps> Start-Job -FilePath .\GetServerDetailsLight.ps1 -ArgumentList DBSERVER,LOGDB,SERVER01,SERVER01

Id              Name            State      HasMoreData     Location             Command
--              ----            -----      -----------     --------             -------
21              Job21           Running    True            localhost            param($sqlsrv,$destdb,...

GAC    Version        Location
---    -------        --------
True   v2.0.50727     C:\WINDOWS\assembly\GAC_MSIL\Microsoft.SqlServer.Smo\10.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Smo.dll
getinfo MSDCHR01 MSDCHR01
Entered GetInfo with: SERVER01,SERVER01

我得到的最后一个输出是“Entered GetInfo with: SERVER01,SERVER01”。如果我像这样手动运行它:PS C:\sqlps> .\GetServerDetailsLight.ps1 DBSERVER LOGDB SERVER01 SERVER01 WMI 查询按预期执行。

我正在尝试确定这是为什么,或者至少是一种从作业中捕获错误的有用方法。

谢谢!

【问题讨论】:

  • 您使用的是 Windows XP 吗?后台作业中的 WMI 存在一个已知问题。我在好几个地方都看到过。此外,仅供参考,后台作业不支持 NTLM 以外的任何身份验证。
  • 我正在使用 XP。我不知道 WMI 特定问题。我确实遇到了 all 后台作业挂起的问题,但通过删除 SCOM 解决了这个问题。这个已知问题是否记录在任何地方?
  • 不确定这是否记录在任何地方。我正在尝试在键入此内容时找到它。

标签: powershell


【解决方案1】:

这是我能找到的一个实例。 http://social.technet.microsoft.com/Forums/en-US/winserverpowershell/thread/a6c816dd-2c2c-47bc-a2d0-238fbb9d66a6

我还看到过很多其他类似的讨论。

无论如何,要确保您的 WMI 存储库没有损坏,请尝试重新编译它。将以下行放入批处理文件并运行:

net stop winmgmt
c:
cd c:\windows\system32\wbem
rd /S /Q repository
regsvr32 /s %systemroot%\system32\scecli.dll
regsvr32 /s %systemroot%\system32\userenv.dll
mofcomp cimwin32.mof
mofcomp cimwin32.mfl
mofcomp rsop.mof
mofcomp rsop.mfl
for /f %%s in ('dir /b /s *.dll') do regsvr32 /s %%s
for /f %%s in ('dir /b *.mof') do mofcomp %%s
for /f %%s in ('dir /b *.mfl') do mofcomp %%s
mofcomp exwmi.mof
mofcomp -n:root\cimv2\applications\exchange wbemcons.mof
mofcomp -n:root\cimv2\applications\exchange smtpcons.mof
mofcomp exmgmt.mof

【讨论】:

  • 我给了你答案,因为你用你的评论回答了它。我将脚本移动到服务器 2008 并且它们正确执行。
【解决方案2】:

帮自己一个忙并检查 WinRM。如果关闭远程处理,您将遇到这组确切的症状。

Can *.ps1 scripts run as background jobs themselves execute *.ps1 scripts?

How do I debug a PowerShell background job?

【讨论】:

  • 这没有使用 PowerShell 远程处理,所以这不是问题。
  • 是的。我也是这么想的。但是,当您开始作业并且您的代码调用 WMI 时,该命令是通过 PS Remoting 发出的。我的工作代码运行得非常好,但是当我输入 WMI 调用时,代码失败了。经过一番摸索,我了解到 PS 使用 WMI 在幕后进行了自己的远程处理。
【解决方案3】:

您的脚本使用写入凭据对我来说运行良好,但在凭据错误时被阻止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    相关资源
    最近更新 更多