首页 > 解决方案 > CIM、Win32_OperatingSystem 和 Win32ShutdownTracker

问题描述

我正在尝试将一些 PowerShell 代码从使用 WMI 转换为使用 CIM。我有一个使用 Win32ShutdownTracker ( https://msdn.microsoft.com/en-us/windows/desktop/aa394057 ) 重新启动系统的函数,其中包含超时、注释和启动重新启动的原因。使用 WMI,我必须使用“psbase.Scope.Options.EnablePrivileges = $true”为运行重新启动权限的帐户授予权限,即使该帐户已经是本地系统上的管理员。我还没有弄清楚如何使用 CIM 授予相同的权限,似乎没有它们,我无法重新启动系统。此外,类绑定似乎不起作用。任何帮助将不胜感激。

我尝试了许多 CIM 组合,包括获取对象然后调用它并直接调用该类,但没有一个有效。

WMI 代码(正常工作):

$OSObject  = Get-WmiObject -Class Win32_OperatingSystem
$OSObject.psbase.Scope.Options.EnablePrivileges = $true
$OSObject.Win32ShutdownTracker(300,"This is a test",2147745794,6) 

我试过的 CIM 代码(不起作用):

$OSObject  = Get-CimInstance -Class Win32_OperatingSystem
$OSObject.psbase.Scope.Options.EnablePrivileges = $true

在此对象上找不到属性“EnablePrivileges”。验证该属性是否存在并且可以设置。在 line:1 char:1 + $OSObject.psbase.Scope.Options.EnablePrivileges = $true + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : PropertyNotFound

Invoke-CimMethod -CimClass $OSObject -MethodName Win32ShutdownTracker –Arguments 300,"This is a test",21477
45794,6

Invoke-CimMethod:无法绑定参数“CimClass”。无法将类型“Microsoft.Management.Infrastructure.CimInstance#root/cimv2/Win32_OperatingSystem”的“Win32_OperatingSystem:Microsoft Windows 10 Enterprise”值转换为类型“Microsoft.Management.Infrastructure.CimClass”。在 line:1 char:28 + Invoke-CimMethod -CimClass $OSObject -MethodName Win32ShutdownTracker ... + ~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Invoke-CimMethod], ParameterBindingException + FullyQualifiedErrorId : CannotConvertArgumentNoMessage ,Microsoft.Management.Infrastructure.CimCmdlets.Invok eCimMethodCommand

Invoke-CimMethod -CimClass "Win32_OperatingSystem" -MethodName Win32ShutdownTracker –Arguments @{300,"This is a test",2147745794,6}

Invoke-CimMethod -CimClass "Win32_OperatingSystem" -MethodName Win32ShutdownTracker –Arguments @{300,"This
is a test",2147745794,6}
Invoke-CimMethod -CimClass "Win32_OperatingSystem" -MethodName "Win32ShutdownTracker" –Arguments 300,"This
is a test",2147745794,6

Invoke-CimMethod:无法绑定参数“CimClass”。无法将“System.String”类型的“Win32_OperatingSystem”值转换为“Microsoft.Management.Infrastructure.CimClass”类型。在 line:1 char:28 + Invoke-CimMethod -CimClass "Win32_OperatingSystem" -MethodName "Win32 ... + ~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Invoke-CimMethod], ParameterBindingException + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.Management.Infrastructure.CimCmdlets.Invok eCimMethodCommand

Invoke-CimMethod -CimClass "Win32_OperatingSystem" -MethodName Win32ShutdownTracker –Arguments 300,"This is
 a test",2147745794,6

Invoke-CimMethod:无法绑定参数“CimClass”。无法将“System.String”类型的“Win32_OperatingSystem”值转换为“Microsoft.Management.Infrastructure.CimClass”类型。在 line:1 char:28 + Invoke-CimMethod -CimClass "Win32_OperatingSystem" -MethodName Win32S ... + ~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument : (:) [Invoke-CimMethod],ParameterBindingException + FullyQualifiedErrorId:CannotConvertArgumentNoMessage,Microsoft.Management.Infrastructure.CimCmdlets.Invok eCimMethodCommand

(Invoke-CimMethod -CimClass 'Win32_OperatingSystem').Win32ShutdownTracker(300,"This is a test",2147745794,6
)

Invoke-CimMethod:无法绑定参数“CimClass”。无法将“System.String”类型的“Win32_OperatingSystem”值转换为“Microsoft.Management.Infrastructure.CimClass”类型。在 line:1 char:29 + (Invoke-CimMethod -CimClass 'Win32_OperatingSystem').Win32ShutdownTra ... + ~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument:(:) [Invoke-CimMethod],ParameterBindingException + FullyQualifiedErrorId:CannotConvertArgumentNoMessage,Microsoft.Management.Infrastructure.CimCmdlets.Invok eCimMethodCommand

(Invoke-CimMethod -CimClass $OSObject).Win32ShutdownTracker(300,"This is a test",2147745794,6)

Invoke-CimMethod:无法绑定参数“CimClass”。无法将类型“Microsoft.Management.Infrastructure.CimInstance#root/cimv2/Win32_OperatingSystem”的“Win32_OperatingSystem:Microsoft Windows 10 Enterprise”值转换为类型“Microsoft.Management.Infrastructure.CimClass”。在 line:1 char:29 + (Invoke-CimMethod -CimClass $OSObject).Win32ShutdownTracker(300,"This ... + ~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Invoke-CimMethod] ,ParameterBindingException + FullyQualifiedErrorId:CannotConvertArgumentNoMessage,Microsoft.Management.Infrastructure.CimCmdlets.Invok eCimMethodCommand

标签: powershell

解决方案


这对我有用:

$arguments = @{
    Timeout    = [System.UInt32]300
    Comment    = 'This is a test'
    ReasonCode = [System.UInt32]2147745794
    Flags      = 6
}

Invoke-CimMethod -Query 'SELECT * FROM Win32_OperatingSystem' -MethodName 'Win32ShutdownTracker' –Arguments $arguments

推荐阅读