151 lines
6.0 KiB
Python
151 lines
6.0 KiB
Python
import xml.etree.ElementTree as ET
|
|
import os
|
|
import subprocess
|
|
import requests
|
|
|
|
def request(function,variable): ##API-Server
|
|
url = (f"http://api.stines.de:8001/{function}")
|
|
response = requests.post(url,json = variable,headers={'access_token':'^YWUbG7yX*V!tV^KBSd*2c&vdN3wV9a2i7f3hfGFMBYFxi6#mMiJGiaA5KEHE%B*miK%qb7rQ67gmcYP@gqmux8'})
|
|
return response
|
|
|
|
|
|
def extract_gpo_permissions(xml_file_path, output_file_path):
|
|
# XML-Datei laden
|
|
with open(xml_file_path, 'r', encoding="utf-8") as xml_file:
|
|
xml_content = xml_file.read()
|
|
|
|
root = ET.fromstring(xml_content)
|
|
count = 0
|
|
# XML-Namespace deklarieren
|
|
namespaces = {
|
|
"gp": "http://www.microsoft.com/GroupPolicy/Types/Security",
|
|
"type" : "http://www.microsoft.com/GroupPolicy/Types",
|
|
"gp_drive": "http://www.microsoft.com/GroupPolicy/Settings/DriveMaps"
|
|
}
|
|
|
|
gruppe = []
|
|
|
|
# Alle TrusteePermissions-Blöcke aus der XML-Datei auswählen
|
|
trustee_permissions_blocks = root.findall(".//gp:TrusteePermissions", namespaces)
|
|
|
|
for trustee_permissions_block in trustee_permissions_blocks:
|
|
trustee = trustee_permissions_block.find(".//type:Name", namespaces).text
|
|
|
|
# Überprüfe, ob der Trustee-Name mit "G-" beginnt oder "scannerworkst" enthält
|
|
if "G-" in trustee or "scannerwork" in trustee:
|
|
trustee = trustee.split('\\')
|
|
result = f"{trustee[-1]}"
|
|
# print(result)
|
|
if result != "":
|
|
gruppe.append(result)
|
|
|
|
drives = []
|
|
# Alle DriveMapSettings-Blöcke aus der XML-Datei auswählen
|
|
drive_map_settings_blocks = root.findall(".//gp_drive:DriveMapSettings/gp_drive:Drive", namespaces)
|
|
|
|
for drive_map_settings_block in drive_map_settings_blocks:
|
|
properties = drive_map_settings_block.find(".//gp_drive:Properties", namespaces)
|
|
if properties.get("action") != "D":
|
|
drive_path = properties.get("path")
|
|
drive_letter = properties.get("letter")
|
|
drive_label = properties.get("label")
|
|
|
|
# Erstelle ein neues Array für die Ergebnisse der aktuellen Schleifeniteration
|
|
aktuelles_ergebnis = [gruppe, drive_letter, drive_path, drive_label]
|
|
|
|
# Füge das aktuelle Array zur Liste der Ergebnisse hinzu
|
|
drives.append(aktuelles_ergebnis)
|
|
|
|
return drives
|
|
|
|
def get_local_ip():
|
|
powershell_script = '''
|
|
(Get-NetIPAddress | Where-Object { $_.PrefixOrigin -eq "Dhcp" }).IPAddress
|
|
'''
|
|
result = subprocess.check_output(["powershell.exe", "-command", powershell_script], universal_newlines=True)
|
|
ip = result.rsplit('.',1)
|
|
print(ip[0])
|
|
ip = ip[0] + '.' + "0"
|
|
return ip
|
|
|
|
def powershell_gpo_export():
|
|
|
|
script = r'''# Verzeichnis, in dem die XML-Berichte gespeichert werden sollen
|
|
$reportDirectory = "C:\GPO_Export"
|
|
|
|
# Verzeichnis, in dem die DriveMapSettings-Berichte gespeichert werden sollen
|
|
$driveMapSettingsDirectory = "C:\GPO_Export\DriveMapSettings"
|
|
|
|
# Erstellen Sie den Ordner "DriveMapSettings", wenn er nicht vorhanden ist
|
|
if (-not (Test-Path -Path $driveMapSettingsDirectory)) {
|
|
New-Item -Path $driveMapSettingsDirectory -ItemType Directory
|
|
}
|
|
|
|
# Abrufen aller GPOs in Ihrer Domäne
|
|
$allGPOs = Get-GPO -All
|
|
|
|
# Iterieren durch alle GPOs und erstellen Sie einen Bericht für jedes GPO
|
|
foreach ($GPO in $allGPOs) {
|
|
# GPO-Namen ohne Doppelpunkte
|
|
$GPONameWithoutColon = $GPO.DisplayName -replace ':', ''
|
|
|
|
# Berichtsnamen basierend auf dem GPO-Namen ohne Doppelpunkte
|
|
$reportName = "$GPONameWithoutColon.xml"
|
|
|
|
# Vollständiger Pfad zum XML-Bericht
|
|
$reportPath = Join-Path -Path $reportDirectory -ChildPath $reportName
|
|
|
|
# GPO-Bericht erstellen und in XML speichern
|
|
$GPO | Get-GPOReport -ReportType XML | Out-File -FilePath "$reportPath" -Encoding UTF8
|
|
|
|
# Überprüfen, ob der Bericht DriveMapSettings-Einstellungen enthält
|
|
$containsDriveMapSettings = (Get-Content -Path $reportPath) -match "DriveMapSettings"
|
|
|
|
if ($containsDriveMapSettings) {
|
|
# Verschieben Sie den Bericht in den "DriveMapSettings"-Ordner
|
|
$newReportPath = Join-Path -Path $driveMapSettingsDirectory -ChildPath $reportName
|
|
Move-Item -Path $reportPath -Destination $newReportPath
|
|
Write-Host "Bericht für $($GPO.DisplayName) mit DriveMapSettings wurde in $newReportPath verschoben."
|
|
}
|
|
else {
|
|
# Löschen Sie den Bericht, wenn er keine DriveMapSettings-Einstellungen enthält
|
|
Remove-Item -Path $reportPath
|
|
}
|
|
}
|
|
|
|
# Verzeichnis, in dem die XML-Dateien gespeichert sind
|
|
$xmlDirectoryPath = $driveMapSettingsDirectory
|
|
|
|
# Verzeichnis, in dem die Ergebnisse gespeichert werden sollen
|
|
$outputDirectory = $driveMapSettingsDirectory
|
|
if (-not (Test-Path -Path $outputDirectory)) {
|
|
New-Item -Path $outputDirectory -ItemType Directory
|
|
}
|
|
'''
|
|
|
|
|
|
subprocess.run(["powershell", "-Command", script], capture_output = True,text = True)
|
|
|
|
powershell_gpo_export()
|
|
|
|
database = request("host/get/database",{"ip":get_local_ip()}) ##GET DATABASE FROM SQL-SERVER
|
|
|
|
|
|
ordner_pfad = 'C:\\GPO_Export\\DriveMapSettings\\'
|
|
# Durchlaufe alle Dateien im Ordner
|
|
for datei in os.listdir(ordner_pfad):
|
|
count = 0
|
|
if datei.endswith('.xml'):
|
|
gruppe = extract_gpo_permissions(f"{ordner_pfad}\\{datei}", "output.txt")
|
|
for i in gruppe:
|
|
try:
|
|
gruppe_name = i[0][0]
|
|
letter = i[1]
|
|
path = i[2]
|
|
label = i[3]
|
|
print(gruppe_name)
|
|
print(request("add/group/volume",{"group": gruppe_name,"letter": letter, "path": path.replace("\\","\\\\"),"label": label, "dbname": database.text.replace('"','')}).text)
|
|
except:
|
|
next
|
|
|