来自远程 PC 的 SCCM cmdlet

SCCM cmdlet from a remote PC

我正在尝试创建一个脚本来查询 sccm2012 设备集合的成员,以便我可以通过管道将其投入维护 window。我需要从远程机器 运行 这个。

这是我所拥有的 - 如果我逐行 运行 它工作正常。 但是,如果我 运行 它作为脚本不断失败。如果你能指出我正确的方向,请或为我解决。 PS 我不太擅长 PS 但正在变得更好。

PS F:\Install\Scritps> Enter-PSSession -ComputerName SERVER -ConfigurationName Microsoft.PowerShell32

Import-module "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\ConfigurationManager.psd1"

cd P01:\

Import-module : The specified module 'C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\ConfigurationManager.psd1' was not loaded because no 
valid module file was found in any module directory.
At line:4 char:1
+ Import-module "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConso ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (C:\Program File...ionManager.psd1:String) [Import-Module], FileNotFoundException
    + FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand

cd : Cannot find drive. A drive with the name 'P01' does not exist.
At line:6 char:1
+ cd P01:\
+ ~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (P01:String) [Set-Location], DriveNotFoundException
    + FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.SetLocationCommand

我猜想 Enter-PSSession 失败是因为它是为交互式使用而设计的,而不是在脚本中使用。如果失败,则以下命令将失败,因为您缺少 SCCM 2012 管理控制台。

要运行 脚本中的远程命令,请使用Invoke-Command。如果您需要特殊配置、不同的凭据等,请将其与 New-PSSession 结合使用。

$sess = New-PSSession -ComputerName SERVER -ConfigurationName Microsoft.PowerShell32

Invoke-Command -Session $sess -ScriptBlock {

    Import-module "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\ConfigurationManager.psd1"

    cd P01:\

    gci
}

Powershell 相当于 SCCM 中的查询 UI

我猜您想要编写与 SCCM 允许您在此设备集合查询规则中指定的相同查询的脚本 属性 对话框:

从工作站上的 powershell 在 SCCM 服务器上进行此类查询的最可靠方法是 运行 使用 CIM。诀窍是弄清楚如何 运行 查询,以便以与 SCCM 本身 运行 查询完全相同的方式解释它。这样做似乎可以实现该目标:

$SiteCode       = 'ST1'    # replace this with your SCCM site code
$SccmServerName = 'sccm01' # replace this with your server name

# replace this with your query
$query = @'
select 
    SMS_R_SYSTEM.ResourceID,
    SMS_R_SYSTEM.ResourceType,
    SMS_R_SYSTEM.Name,
    SMS_R_SYSTEM.SMSUniqueIdentifier,
    SMS_R_SYSTEM.ResourceDomainORWorkgroup,
    SMS_R_SYSTEM.Client from SMS_R_System 
inner join 
    SMS_G_System_COMPUTER_SYSTEM 
    on SMS_G_System_COMPUTER_SYSTEM.ResourceId = SMS_R_System.ResourceId 
where 
    SMS_G_System_COMPUTER_SYSTEM.Manufacturer like "%Microsoft%"
'@

$params = @{
    ComputerName = $SccmServerName
    Query        = $query
    NameSpace    = "Root\SMS\Site_$SiteCode"
}

Get-CimInstance @params

上面的查询恰好是针对 Hyper-V 来宾的设备集合。您可以将 $query 更改为任何您想要的。一旦你在这里运行查询,你应该能够复制并粘贴它 to/from SCCM 设备集合 UI.

在 Powershell 远程处理上

如果调用 Get-CimInstance 导致错误,表明 Powershell 远程处理或 CIM 在您的情况下不工作,那么您可能应该集中精力了解您的环境的这方面。 Powershell 远程处理有一些细微的限制和先决条件,这些限制和先决条件除其他外取决于防火墙设置、启用远程处理以及您 运行 正在使用的 Powershell 和操作系统的版本。不值得记住所有的细节。我使用的参考是Powershell in Depth, second edition.

的第10章

如果事实证明您必须使用 WMI 而不是 CIM,那么将对 Get-CimInstance 的调用转换为 Get-WmiObject 应该相当简单。

Frode F.你就是那个人

是的,效果很好。

在 } 之后的末尾我放了 "Remove-PSSession -ComputerName SERVER"

这样,当您 运行 并发会话填满几次时。有了这条额外的线,不用担心。