来自远程PC的SCCM cmdlet

时间:2015-03-09 05:12:23

标签: powershell sccm

我正在尝试创建一个脚本来查询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

3 个答案:

答案 0 :(得分:0)

我认为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
}

答案 1 :(得分:0)

Powershell等效于SCCM UI中的查询

我猜你想编写相同的查询,因为SCCM允许你在这个设备集合中指定查询规则属性对话框:

enter image description here

从工作站上的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 Remoting

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

如果事实证明你必须使用WMI而不是CIM,那么将呼叫转换为Get-CimInstanceGet-WmiObject应该相当简单。

答案 2 :(得分:0)

Frode F.你是男人

是的,它真的很好用。

在} i之后放置"删除-PSSession -ComputerName SERVER"

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