1

使用 UI (SCCM 2012) 时,为了能够删除集合(比如 CollA),您首先需要确保它没有通过任何规则链接到另一个(比如 CollB 等),例如:

  • CollB 包括 CollA
  • CollC 不包括 CollA

在处理大量集合时,删除集合可能会很耗时。出于这个原因,我创建了一个脚本,

  • 可远程使用以避免需要通过 RDP 连接
  • 它检查 CollA 是否没有剩余规则(即使如果我们想删除 CollA 这不是问题)
  • 检查 CollA 是否“链接”到其他集合(包括或排除规则)
  • 删除找到的任何规则(在 CollB 和 CollA 之间,在 CollC 和 CollA 之间)

我现在被卡住了,因为我找不到删除 CollA 的方法。对于身份验证问题和远程目的,我使用了很多 Powershell 和 WMI。

$CollA=Get-WmiObject -computername servername -namespace root\sms\site_111 -credential $cred -query "select * from SMS_Collection where Name='Tartempion'"
$CollA.get()

那时,我找到了一个方法 Delete(),当我尝试使用它时,它给了我:

Exception calling "Delete" with "0" argument(s): "Generic failure "
At line:1 char:1
+ $coll.delete()
+ ~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException

如果那是我应该使用的方法,要传递的参数是什么?

编辑 1

正如 MadTechnician 所指出的,SCCM 集合一旦在 $CollA 中检索到一个 System.Management.ManagementObject。如 MSDN 页面中所述,我应该能够使用以下方法:

  • Delete() > 产生上述错误
  • Delete(DeleteOptions) > 我找不到所需选项的规格
  • Delete(ManagementOperationObserver) > 我找不到所需选项的规格

为确保我正确理解有关 *.Delete() 的 MSDN 页面,我尝试(成功)以下操作:

PS C:\> Set-WmiInstance -Class win32_environment -argument @{Name="testvar";VariableValue="testvalue";UserName="<SYSTEM>"}
PS C:\> (gwmi -class win32_environment -filter "Name='testvar'").gettype()
PS C:\> (gwmi -class win32_environment -filter "Name='testvar'").delete()

编辑 2

事实是,当通过控制台删除 SCCM 集合时,集合并不是从清单中删除的唯一内容:例如,分配也被删除了。它提醒在处理 MySQL 或 ORACLE 时的 CASCADE 开关。也许我想做的事情是不可能的

  • 不使用控制台
  • 不使用 SCCM cmdlet

如果不能那样做,我只需要确定。

编辑 3

经过一段时间的成熟,我开始怀疑这是否可能是授权问题。我的意思是,我使用“-credential”开关或连接到服务器时打开 SCCM 控制台的帐户允许我创建/更新/删除集合,但例如,它不允许我删除一个设备。我希望错误消息会有所不同,但谁知道呢?

或多或少关于同一件事(对不起题外话),试图从命令行中删除一个设备,我发现了这个并且我有相同的错误消息(见上文)。如果它适用于其他人而不是我,它可能与授权有关吗?

编辑 4

我请求了一个比我的技术帐户拥有更多“特权”的服务帐户。我测试了,我有同样的错误。我把授权假设放在一边。

4

2 回答 2

0

您可能会像这样设置脚本:

#if the delete command fails...
 if(!($?))
   {
     $limitedcollectionName = $colla.LimitedCollectionName
     $limitedcollection = Get-WmiObject -computername servername -namespace root\sms\site_111 -query "select * from SMS_Collection where Name=`'$limitedcollectionname`'"
     $limitedcollectionname.delete()
    }
于 2014-03-26T16:07:38.073 回答
0

我刚刚在我们的 SCCM 2012 环境中使用以下命令对此进行了测试:

$CollA=Get-WmiObject -computername servername -namespace root\sms\site_111 -query "select * from SMS_Collection where Name='Tartempion'"

基本上,从那里取出 -credential。它现在有效吗?

于 2014-03-26T12:23:13.847 回答