Welche Freigaben gibt es auf unseren Servern und wer hat darauf Zugriff? Ein Standard-Report fehlt – mit einer eigenen WMI-Klasse und der Hardwareinventur lässt sich das Problem dennoch lösen.
Eine Frage aus der Community: Gibt es in Configuration Manager einen Standardbericht, der die Berechtigungen der Freigaben auf allen Servern auflistet? Die kurze Antwort: nein. Die lange Antwort: Mit etwas Vorarbeit liefert ConfigMgr diese Daten trotzdem – und zwar über die erweiterte Hardwareinventur.
Das Prinzip
ConfigMgr inventarisiert alles, was in WMI steht. Freigabeberechtigungen stehen dort aber nicht in einer abfragefertigen Form. Die Lösung besteht deshalb aus drei Schritten:
- Daten erzeugen: Ein Skript liest auf jedem Server die Freigaben (
Win32_Share) und deren Sicherheitsbeschreibungen (Win32_LogicalShareSecuritySetting) aus und schreibt das Ergebnis in eine eigene WMI-Klasse, z. B.SMS_SharePerms. - Daten inventarisieren: Die neue Klasse wird in die Hardwareinventur aufgenommen. Der Client sendet die Daten mit dem nächsten Inventurzyklus an die Site.
- Daten auswerten: Aus der dabei entstehenden SQL-View wird ein Bericht in SQL Server Reporting Services erstellt.
Die Datenstruktur
Pro Berechtigungseintrag (ACE) legt das Skript eine Instanz mit folgenden Eigenschaften an:
| Eigenschaft | Inhalt |
|---|---|
| Counter | Laufende Nummer (Schlüssel) |
| ShareName | Name der Freigabe |
| Domain / TrusteeName | Berechtigter Benutzer bzw. Gruppe |
| Allowed | Zulassen (1) oder Verweigern (0) |
| Type | Read, Change oder Full |
Standardfreigaben wie ADMIN$, IPC$ und die Laufwerksfreigaben werden übersprungen.
Moderne Umsetzung mit PowerShell
Die ursprüngliche Lösung aus der Community bestand aus einem umfangreichen VBScript, das per Operations Manager zeitgesteuert ausgeführt wurde. Heute geht das deutlich schlanker – etwa als Configuration Item (Einstellungsbereich) mit PowerShell-Skript, das ConfigMgr selbst nach Zeitplan ausführt:
$class = 'CWD_SharePerms'
Get-CimInstance -Namespace root\cimv2 -ClassName $class -ErrorAction SilentlyContinue |
Remove-CimInstance
if (-not (Get-CimClass -Namespace root\cimv2 -ClassName $class -ErrorAction SilentlyContinue)) {
$c = New-Object System.Management.ManagementClass('root\cimv2', [string]::Empty, $null)
$c['__CLASS'] = $class
$c.Qualifiers.Add('Static', $true)
'Counter' | ForEach-Object { $c.Properties.Add($_, [System.Management.CimType]::UInt32, $false) }
'ShareName','Domain','TrusteeName','Type' |
ForEach-Object { $c.Properties.Add($_, [System.Management.CimType]::String, $false) }
$c.Properties.Add('Allowed', [System.Management.CimType]::Boolean, $false)
$c.Properties['Counter'].Qualifiers.Add('Key', $true)
[void]$c.Put()
}
$i = 0
Get-SmbShare -Special $false | ForEach-Object {
$share = $_.Name
Get-SmbShareAccess -Name $share | ForEach-Object {
$i++
$domain, $user = if ($_.AccountName -match '\\') { $_.AccountName -split '\\', 2 } else { '', $_.AccountName }
New-CimInstance -Namespace root\cimv2 -ClassName $class -Property @{
Counter = [uint32]$i; ShareName = $share; Domain = $domain; TrusteeName = $user
Type = [string]$_.AccessRight; Allowed = ($_.AccessControlType -eq 'Allow')
} | Out-Null
}
}
'Compliant'
Anschließend fügen Sie die Klasse CWD_SharePerms in den Clienteinstellungen › Hardwareinventur › Klassen festlegen › Hinzufügen hinzu, indem Sie sich mit einem Server verbinden, auf dem das Skript bereits gelaufen ist.
Der Bericht
Nach dem ersten Inventurzyklus steht eine View wie v_GS_CWD_SHAREPERMS zur Verfügung. Ein einfacher Bericht verknüpft sie mit v_R_System:
SELECT sys.Name0 AS Server, sp.ShareName0 AS Freigabe,
sp.Domain0 + '\' + sp.TrusteeName0 AS Berechtigter,
sp.Type0 AS Recht, CASE sp.Allowed0 WHEN 1 THEN 'Zulassen' ELSE 'Verweigern' END AS Art
FROM v_GS_CWD_SHAREPERMS sp
JOIN v_R_System sys ON sys.ResourceID = sp.ResourceID
ORDER BY sys.Name0, sp.ShareName0
Heute
Der Ansatz – eigene WMI-Klasse plus Hardwareinventur – ist in Configuration Manager Current Branch nach wie vor der Standardweg für eigene Inventurdaten. Für Ad-hoc-Abfragen ohne Inventur bietet sich zusätzlich CMPivot an. Beachten Sie: Hier geht es um *Freigabe*berechtigungen; NTFS-Berechtigungen auf Dateisystemebene erfordern eine eigene Auswertung und sind in großen Umgebungen eher ein Fall für spezialisierte Werkzeuge.