【问题标题】:Delete a SCCM collection from the command-line从命令行删除 SCCM 集合
【发布时间】:2014-03-25 15:56:06
【问题描述】:

在使用 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 控制台的帐户允许我创建/更新/删除集合,但例如,它不允许我删除一个设备。我希望错误消息会有所不同,但谁知道呢?

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

编辑 4

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

【问题讨论】:

  • 我假设它是您正在使用的 System.Management.ManagementObject,对吧?您是否查看了MSDN 页面以查看方法以及如何调用它们?
  • 跟随您的引导,查看更新的问题,

标签: powershell wmi sccm


【解决方案1】:

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

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

基本上,从那里取出 -credential。现在还能用吗?

【讨论】:

  • 愤怒了,我试过了,从服务器上删除了集合,此时不需要提及凭据,它不起作用(请参阅原始帖子中的错误)。我猜由于 CASCADE 操作,我无法从命令行删除集合。
  • 我明白了,我能够重新创建问题。我创建了两个集合。一个链接到另一个。如果我先删除限制为的集合,然后删除它起作用的原始目标集合。
【解决方案2】:

您可以像这样设置脚本:

#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()
    }

【讨论】:

  • 我误导了你或者我没有理解你的建议。我的环境中的 $CollA 没有名为 LimitedCollectionName 的属性。它有一个名为 LimitToCollectionName 的属性,它指向一个我不能也不想删除的集合。我知道如何“取消链接”两个集合,无论链接如何(排除规则、包含规则等)。换个说法,我的问题是:如何从命令行中删除“孤儿”的集合?
猜你喜欢
  • 2017-04-15
  • 2020-08-01
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多