我正在尝试创建一个脚本来查询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
答案 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)
我猜你想编写相同的查询,因为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中。
如果对Get-CimInstance
的调用导致错误表明Powershell远程处理或CIM在您的情况下不起作用,那么您应该专注于了解环境的这一方面。 Powershell远程处理具有一些细微的限制和先决条件,这些限制和先决条件除其他外依赖于防火墙设置,启用远程处理以及您正在运行的Powershell和操作系统的版本。它不值得记住所有的细节。我使用的参考是Powershell in Depth, second edition的第10章。
如果事实证明你必须使用WMI而不是CIM,那么将呼叫转换为Get-CimInstance
到Get-WmiObject
应该相当简单。
答案 2 :(得分:0)
Frode F.你是男人
是的,它真的很好用。
在} i之后放置"删除-PSSession -ComputerName SERVER"
这样当你运行几次并发会话时就会填满。这条额外的线不用担心。