
Me gustaría encontrar un script de PowerShell que recupere las colecciones de SCCM para una computadora o usuario determinado. Sé que esto se puede lograr mediante una consulta SCCM, pero me gustaría hacerlo usando una función de PowerShell.
El script debería funcionar con SCCM 2007 y SCCM 2012.
Respuesta1
Aquí está la función de PowerShell para hacer eso:
$Server = "sccm-01"
$site = "S01"
Function Get-Collections
{
<#
.SYNOPSIS
Determine the SCCM collection membership
.DESCRIPTION
This function allows you to determine the SCCM collection membership of a given user/computer
.PARAMETER Type
Specify the type of member you are querying. Possible values : 'User' or 'Computer'
.PARAMETER ResourceName
Specify the name of your member : username or computername
.EXAMPLE
Get-Collections -Type computer -ResourceName PC001
Get-Collections -Type user -ResourceName User01
.Notes
Author : Antoine DELRUE
WebSite: http://obilan.be
#>
param(
[Parameter(Mandatory=$true,Position=1)]
[ValidateSet("User", "Computer")]
[string]$type,
[Parameter(Mandatory=$true,Position=2)]
[string]$resourceName
) #end param
Switch ($type)
{
User {
Try {
$ErrorActionPreference = 'Stop'
$resource = Get-WmiObject -ComputerName $server -Namespace "root\sms\site_$site" -Class "SMS_R_User" | ? {$_.Name -ilike "*$resourceName*"}
}
catch {
Write-Warning ('Failed to access "{0}" : {1}' -f $server, $_.Exception.Message)
}
}
Computer {
Try {
$ErrorActionPreference = 'Stop'
$resource = Get-WmiObject -ComputerName $server -Namespace "root\sms\site_$site" -Class "SMS_R_System" | ? {$_.Name -ilike "$resourceName"}
}
catch {
Write-Warning ('Failed to access "{0}" : {1}' -f $server, $_.Exception.Message)
}
}
}
$ids = (Get-WmiObject -ComputerName $server -Namespace "root\sms\site_$site" -Class SMS_CollectionMember_a -filter "ResourceID=`"$($Resource.ResourceId)`"").collectionID
# A little trick to make the function work with SCCM 2012
if ($ids -eq $null)
{
$ids = (Get-WmiObject -ComputerName $server -Namespace "root\sms\site_$site" -Class SMS_FullCollectionMembership -filter "ResourceID=`"$($Resource.ResourceId)`"").collectionID
}
$array = @()
foreach ($id in $ids)
{
$Collection = get-WMIObject -ComputerName $server -namespace "root\sms\site_$site" -class sms_collection -Filter "collectionid=`"$($id)`""
$Object = New-Object PSObject
$Object | Add-Member -MemberType NoteProperty -Name "Collection Name" -Value $Collection.Name
$Object | Add-Member -MemberType NoteProperty -Name "Collection ID" -Value $id
$Object | Add-Member -MemberType NoteProperty -Name "Comment" -Value $Collection.Comment
$array += $Object
}
$array
}
Simplemente adapte el valor de las variables $Server y $Site según su entorno.
A continuación se muestran ejemplos de cómo utilizar esta función:
Get-Collections -Type computer -ResourceName PC001
Get-Collections -Type user -ResourceName User01
El resultado será una tabla que muestra el ID de la colección, el nombre de la colección y el comentario asociados con la computadora o el usuario.
¡Espero que esto ayude!
Respuesta2
Sé que esto ya está respondido, pero deberías consultar este script de Powershell creado por Russ Slaten de Microsoft. Creó una GUI en Powershell que puede usar para: Obtener miembros directos Agregar miembros directos Eliminar miembros directos en colecciones de usuarios y dispositivos.
También puede crear una nueva colección de usuarios al agregar nuevos miembros.
Lo uso desde hace casi un año y nunca me falló.