Clever-Excel-Forum

Normale Version: ADMX-File auslesen und in Tabelle schreiben
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
Hallo!

Wie kann man ADMX-Files auslesen und in eine Tabelle schreiben? Unter ADMX auslesen gibt es zwar einen Code (Powershell), aber der arbeitet extrem fehlerhaft (alles durcheinander und vieles nicht dort wo es sein müsste). Bei MS gibt es zwar "ADMX Guids" als Excceldateien, aber denen fehlt der für mich wichtige Reg-Type, Reg-Value nicht separat (nur mit ganzem Pfad) und ist nur auf englisch. Und der Gruppenrichtlinieneditor (gpedit) ist auch nicht hilfreich, da der auch nicht alles anzeigt was ich wissen möchte/muss.

Der folgende Code wäre zwar ein Ansatz, aber wenn man nicht weiss was man angeben muss... ;)

Code:
Sub Test()

Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.Async = "False"
xmlDoc.Load ("C:\Windows\PolicyDefinitions\outlk16.admx")
Set colNodes = xmlDoc.SelectNodes("/policyDefinitions/policies/policy")
For Each objNode In colNodes
  Debug.Print objNode.Attributes.getNamedItem("name").NodeValue
  Debug.Print objNode.Attributes.getNamedItem("key").NodeValue
Next
End Sub

Ausgelesen werden sollen:
Beschreibung (PolicyDescription), Titel (PolicyTitel), Typ (Reg-Type), Wertname (Reg-Value), Pfad (Reg-Path)

Danke!

Gruß, René
Hallo,

ich würde gerne etwas positiv zu der Frage beitragen, aber mangels Kenntnissen nur eine kleine Ergänzung:

In den Tiefen des Windows-Systems gibt es die Datei "adsutil.vbs", die ähnlich verschlüsselt/kompeliert ist wie die angesproche ADMX-Datei (lesbar mit dem Gruppenrichtlinien-Editor? nicht in meiner home-edition enthalten. Bisher kannte ich *.vbs Dateien nur als lesbaren VB-Code.

mfg
(25.06.2017, 10:46)Fennek schrieb: [ -> ](...) die ähnlich verschlüsselt/kompeliert ist wie die angesproche ADMX-Datei (...)
Das ist nicht vergleichbar. Die adsutil.vbs ist verschlüsselt/kompiliert, somit für Menschen nicht lesbar. Die ADMX-Dateien sind XML-Dateien, können also auch von Menschen gelesen werden.

Das Problem hier ist dass die ADMX-Dateien alleine nicht reichen. Man benötigt auch noch die ADML-Dateien, OPAX-Dateien und OPAL-Dateien. Alles zusammen auslesen und in eine Exceldatei oder Access-Datenbank zu schreiben, und zwar ohne das dabei Müll herauskommt (wie der Code auf der von mir verlinkten Seite), ist sehr schwer und für mich unmöglich.
Und wie sieht dein
"C:\Windows\PolicyDefinitions\outlk16.admx"

aus ?
Brauchst Du den genauen Inhalt?
Ich weiss nicht genau welche Werte du haben willst, denn deine Bezeichnungen stimmen nicht überein miet wie das in der Datei genennt wird.
Vielleicht hilft das dir:


Code:
Sub M_snb()
    sn = Filter(Split(StrConv(CreateObject("scripting.filesystemobject").opentextfile("G:\OF\__outlk16.admx").readall, 128), vbLf), "<policy")
    
    For j = 0 To UBound(sn)
       c00 = ""
       sp = Split(sn(j), "=")
       For jj = 1 To UBound(sp)
         c00 = c00 & vbLf & Split(sp(jj - 1))(UBound(Split(sp(jj - 1)))) & vbTab & IIf(jj = 1 Or jj = 2 Or jj = 6, vbTab, "") & Split(sp(jj))(0)
       Next
       MsgBox c00
    Next
End Sub
Danke!

Benötigt werden nur die Inhalte von "class", "key" und "valueName". Das funktioniert über "Microsoft.XMLDOM" schon. Das Problem ist dass die zugehörigen Inhalte (PolicyTitle, PolicyDescription, Reg-Type) in den anderen Dateien steht, und hier die Zusammenhänge herzustellen ist schwer. Der PS-Code von "Evgenij" macht das, aber fehlerhaft.
Bist du sicher ?

Ich kann weder PolicyTitle, PolicyDescription, noch Reg-Type in den andere Dateien finden.
Den Reg-Typ muss man wohl selber setzen ("Reg-DWord (1)" für "boolean", "REG_Dword" für "decimal". Bei "text" muss man unterscheiden zwischen "normal" und "expandable", um "Reg_SZ" oder "REG_EXPAND_SZ" zu setzen).

"PolicyTitle" und "PolicyDescription" ist das was z.B. in den ADML-Dateien bei "string id" steht.

Das ganze ist aber doch nicht so leicht. Und vielleicht zu komplex für VBA?

Da bleibt wohl doch nur gpedit, und dort "raten" welcher Typ es sein könnte, wird aber leider nicht bei allen Einträgen angezeigt. Bei Office dürfte ohnehin nur REG-DWORD (decimal) und REG_SZ (text) in Frage kommen, "REG_EXPAND-SZ" ist doch eher selten.

Hier mal der Original-PS-Code (der leider einiges falsch macht).

PHP-Code:
$language "de-DE"
$root "C:\Windows\PolicyDefinitions"
$output = @()

$admx_files Get-ChildItem $root -Filter "*.admx"
foreach ($admx in $admx_files) {
 
   $admx_file Split-Path $admx -Leaf
    $adml 
"C:\Windows\PolicyDefinitions\$($language)\$($admx_file.TrimEnd('x'))l"
 
   if (Test-Path $adml) {
 
       $admx_data = [xml](Get-Content $admx.FullName)
 
       $adml_data = [xml](Get-Content $adml -Encoding UTF8)
 
       $adml_strings $adml_data.policyDefinitionResources.resources.stringTable.GetEnumerator()
 
       $policies $admx_data.policyDefinitions.policies
        foreach 
($pol in $policies.policy) {
 
           $dn_string $pol.displayName.Substring(9, ($pol.displayName.Length 10))
 
           $et_string $pol.explainText.Substring(9, ($pol.explainText.Length 10))
 
           $policy_name = ($adml_strings.Where({$_.id -eq $dn_string})).'#text'
 
           $adml_strings.Reset()
 
           $policy_desc = ($adml_strings.Where({$_.id -eq $et_string})).'#text'
 
           $adml_strings.Reset()
 
           if ($pol.elements.HasChildNodes) {
 
               $els $pol.elements.GetEnumerator()
 
               foreach ($el in $els) {
 
                   $reg_value "$($pol.Key)\$($el.valueName)"
 
                   $reg_type ""
 
                   switch ($el.Name) {
 
                       'boolean' $reg_type 'REG_DWORD (1)' }
 
                       'decimal' $reg_type 'REG_DWORD' }
 
                       'text' {
 
                           if ($el.expandable) {
 
                               $reg_type 'REG_EXPAND_SZ'
 
                           } else {
 
                               $reg_type 'REG_SZ'
 
                           }
 
                       }
 
                       'enum' {
 
                           $ex $el.FirstChild.FirstChild.FirstChild.Name
                            switch 
($ex) {
 
                               'decimal' $reg_type 'REG_DWORD' }
 
                               'text' {
 
                                   if ($el.expandable) {
 
                                       $reg_type 'REG_EXPAND_SZ'
 
                                   } else {
 
                                       $reg_type 'REG_SZ'
 
                                   }
 
                               }
 
                           }
 
                       }
 
                       'list' {
 
                           $reg_type 'REG_SZ (list)'
 
                           $reg_value $el.Key
                        
}
 
                       default 
 
                           Write-Host $el.Name -ForegroundColor Cyan
                            $reg_type 
$el.Name
                            $reg_value 
$el.Key
                        
}
 
                   }
 
                   $out_item = New-Object PSObject -Property @{'RegPath' $reg_value'RegType' $reg_type'PolicyTitle' $policy_name'PolicyDescription' $policy_desc'ADMXFile' $admx_file
 
                   $output += $out_item
                
}
 
           } else {
 
               $reg_value "$($pol.Key)\$($pol.valueName)"
 
               $reg_type 'REG_DWORD (1)'
 
               $out_item = New-Object PSObject -Property @{'RegPath' $reg_value'RegType' $reg_type'PolicyTitle' $policy_name'PolicyDescription' $policy_desc'ADMXFile' $admx_file 
 
               $output += $out_item
            
}
 
       }
 
   } else {
 
       Write-Host "ADML in $language not found: $adml-ForegroundColor Yellow
    
}
}
$output Export-CSV c:\temp\admx.csv -Encoding UTF8 -Delimiter ";" 
Warum hast du das alles nicht vom Anfang an erwähnt ???

So stellt man doch keine Fragen ins Forum?  Wir können das alles doch nicht raten ohne Glaskugel ??

Es ist ganz einfach in VBA; aber ohne komplette Infos ist das unmöglich in jeder Sprache.
Das sind doch keine vernünfyige Hinweise ?

Z.B. steht in der ADML-Datei bei string Id


Code:
   <string id="L_AllowSelectionFloaties">Minisymbolleiste für Auswahl anzeigen</string>
     <string id="L_Aqua">Aquamarin</string>
     <string id="L_Arabic">Arabisch</string>
     <string id="L_Black">Schwarz</string>
     <string id="L_Blue">Blau</string>
     <string id="L_DoNotDownloadPhotosFromTheActiveDirectory">Fotos aus Active Directory nicht herunterladen</string>
     <string id="L_DoNotDownloadPhotosFromTheActiveDirectoryExplain">Diese Richtlinieneinstellung steuert, ob Benutzerfotos (wenn verfügbar) aus Active Directory heruntergeladen werden.  

Wenn Sie diese Richtlinieneinstellung aktivieren, werden Fotos nicht heruntergeladen.

Wenn Sie diese Richtlinieneinstellung deaktivieren oder nicht konfigurieren, werden Fotos heruntergeladen.</string>
     <string id="L_Empty">
     </string>
     <string id="L_Fuchsia">Fuchsie</string>
     <string id="L_Gray">Grau</string>
     <string id="L_Greek">Griechisch</string>
     <string id="L_Green">Grün</string>
     <string id="L_Hebrew">Hebräisch</string>
     <string id="L_HideAppsStoreButtonInHomeTabRibbon">Schaltfläche "Office Store" ausblenden</string>
     <string id="L_HideAppsStoreButtonInHomeTabRibbonExplain">Mit
Seiten: 1 2 3