Powershell 来自远程PC的SCCM cmdlet

Powershell 来自远程PC的SCCM cmdlet,powershell,sccm,Powershell,Sccm,我正在尝试创建一个脚本来查询sccm2012设备集合的成员,以便将其导入维护窗口。我需要从远程机器上运行这个 这就是我所拥有的——如果我一行一行地运行,它就可以正常工作。 但如果我以脚本的形式运行它,就会不断失败。如果你能给我指出正确的方向,请帮我解决。PS我的PS不是很好,但是越来越好了 PS F:\Install\Scritps> Enter-PSSession -ComputerName SERVER -ConfigurationName Microsoft.PowerShell32

我正在尝试创建一个脚本来查询sccm2012设备集合的成员,以便将其导入维护窗口。我需要从远程机器上运行这个

这就是我所拥有的——如果我一行一行地运行,它就可以正常工作。 但如果我以脚本的形式运行它,就会不断失败。如果你能给我指出正确的方向,请帮我解决。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
我猜EnterPSSession会失败,因为它是为交互使用而设计的,而不是在脚本中使用。如果失败,那么以下命令将失败,因为您缺少SCCM 2012管理控制台

要在脚本中运行远程命令,请使用Invoke命令。如果您需要特殊配置、不同凭据等,请将其与新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
}
相当于SCCM UI中查询的Powershell 我猜您希望编写与SCCM相同的查询脚本,因为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更改为您想要的任何内容。一旦查询在这里工作,您应该能够将其复制并粘贴到SCCM设备集合UI中

关于Powershell远程处理 如果调用Get-CimInstance导致一个错误,表明Powershell远程处理或CIM在您的案例中不起作用,那么您可能应该重点了解环境的这一方面。Powershell远程处理有一些细微的限制和先决条件,这些限制和先决条件取决于防火墙设置、启用远程处理以及您运行的Powershell和操作系统的版本。不值得记住所有的细节。我使用的参考资料是第10章


如果结果证明您必须使用WMI而不是CIM,那么将调用转换为获取CimInstance以获取WMIOObject应该相当简单。

Frode F。您就是那个人

是的,效果很好

在}之后的末尾,我放入Remove PSSession-ComputerName SERVER


因此,当您运行它几次时,并发会话将被填满。有了这条额外的线路就不用担心了。

我想到的一件事是,sccm模块只能在32位powershell中工作。是否在启动x86 powershell后逐个运行脚本,但直接从文件中运行脚本,这可能会导致使用本机64位powershell对其进行解释?很高兴它成功了。仅供参考,评论不应作为答案提交,而应使用在相关答案下方添加评论。另外,请记住,维护窗口是在集合上定义的,因此您不需要检索集合内的设备,只需使用Get-CMDeviceCollection、New-CmdSchedule和New-CmdainmentWindow 2012 R2将计划添加到集合本身即可。CIM/WMI是一个有效的解决方案,但是,当官方SDK能够解决问题时,几乎总是应该推荐它,因为如果您遇到任何bug,供应商将支持它。而且,使用它更干净。使用Get-CMDeviceCollection、New-CmdSchedule和New-CmdMaintenance Window可以解决创建维护窗口的问题