来自远程 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"
这样,当您 运行 并发会话填满几次时。有了这条额外的线,不用担心。
我正在尝试创建一个脚本来查询 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.
如果事实证明您必须使用 WMI 而不是 CIM,那么将对 Get-CimInstance
的调用转换为 Get-WmiObject
应该相当简单。
Frode F.你就是那个人
是的,效果很好。
在 } 之后的末尾我放了 "Remove-PSSession -ComputerName SERVER"
这样,当您 运行 并发会话填满几次时。有了这条额外的线,不用担心。