
Azure-basiertes Client-Inventar- und Drift-Erkennungstool, das Windows-Konfigurationsdaten (Antivirus, Patchen, Bitlocker) in LogAnalytics sammelt, für KQL-gesteuerte Dashboards und Sentinel-Benachrichtigungen.

Haben Sie die Kontrolle? - oder driften einige Ihrer Kerninfrastrukturprozesse wie Patchen, Antivirus, Bitlocker-Aktivierung ab? Oder möchten Sie eine erweiterte Inventur durchführen, bei der Sie Ihren Garantiestatus gegen die Lenovo- oder Dell-Garantie prüfen können? Dann lesen Sie weiter.
Sehen Sie sich ClientInspector an, der Ihnen helfen kann, großartige Einblicke in Ihre gesamte Client-Umgebung zu gewinnen.
ClientInspector ist kostenlos für die Community - entwickelt als coole Demonstration, wie Sie Daten von Ihren Clients zurückholen können mit Azure Log Ingestion Pipeline, Azure Data Collection Rules, Azure LogAnalytics; betrachten Sie sie mit Azure Monitor & Azure Dashboards - und erhalten Sie "Drift-Alarme" mit Microsoft Sentinel.
ClientInspector (v2) lädt die gesammelten Daten in benutzerdefinierte Protokolle in den Azure LogAnalytics-Arbeitsbereich hoch - unter Verwendung der Log Ingestion API, Azure Data Collection Rules (DCR) und Azure Data Collection Endpoints (DCE).




Es ist mir wichtig zu betonen, dass ich nicht versuche, ein separates Verwaltungstool zu entwickeln, das mit dem Microsoft-Sicherheits- und Verwaltungsstack konkurriert.
Nichts übertrifft den Microsoft Azure/M365-Verwaltungs- und Sicherheitsstack. Sie sind erstklassige Lösungen.
Aber ich bin wirklich leidenschaftlich, was die Protokollierungsfähigkeiten und die Macht angeht, Daten von Clients, Servern, der Cloud und Drittsystemen zurückzuholen - und coole wertvolle Informationen aus den Daten zu gewinnen.
Ich habe eine ähnliche Lösung für Server - ServerInspector. Leider ist sie nicht öffentlich.
Großen Dank an die großartigen Leute in den Microsoft-Produktteams - ihr seid Rockstars 😄
Viel Erfolg bei der Jagd 😄
Welche Daten werden gesammelt?
Sollzustands-Dashboards - Wie erhalte ich Einblicke in meine Umgebung aus den Daten?
Wie frage ich die Daten ab? - Kusto (KQL) ist die Antwort
Architektur, Schema & Netzwerk
Implementierung
Abhängigkeiten
ClientInspector.ps1 ausführen - 3 Modi
Beispielausgabe von ClientInspector
Sicherheit
Aufbau des ClientInspector-Datensatzes
Ausführlicher Modus & Weitere Hilfe
Kosten - Wie viel kostet die Speicherung dieser Daten?
Fehlerfunde, bitte informieren Sie mich
Kontakt
Video 3m 19s - ClientInspector über die Befehlszeile ausführen (normaler Modus)
Video 1m 40s - Automatische Erstellung von 2 Tabellen und DCRs (ausführlicher Modus)
Video 1m 37s - Automatische Erstellung von 2 Tabellen und DCRs (normaler Modus)
Video 1m 34s - Schema von DCR und Tabelle anzeigen)
Video 2m 19s - Datenmanipulation
Video 1m 58s - Kusto-Abfragen gegen Daten
Video 3m 01s - Dashboards
Video 0m 48s - Beispielhafte Nutzung der Daten - Abfrage der Lenovo-Garantiedatenbank
Video 7m 25s - Bereitstellung über ClientInspector DeploymentKit
ClientInspector kann verwendet werden, um viele großartige Informationen von Ihren Windows-Clients zu sammeln - und die Daten an Azure LogAnalytics Custom Tables zu senden.
Das Skript sammelt die folgenden Informationen (Einstellungen, Informationen, Konfiguration, Zustand):
Fügen Sie gerne weitere coole Datensammlungen hinzu, die Ihren Anforderungen entsprechen. Wenn Sie an der Community teilnehmen möchten, senden Sie mir bitte eine E-Mail mit Ihren Sammlungen, wenn Sie glauben, dass sie der gesamten Community von Nutzen sein könnten.
Sie können beliebige Quelldaten verwenden, die in PowerShell abgerufen werden können (WMI, CIM, externe Daten, REST-API, XML-Format, JSON-Format, CSV-Format usw.)
Es ist sehr wichtig zu verstehen, dass die Daten in der Regel vor dem Senden manipuliert werden müssen - um sicherzustellen, dass sie gültig sind und alle irrelevanten Daten entfernt wurden.
ClientInspector verwendet alle 24 Funktionen innerhalb des PowerShell-Moduls AzLogDcIngestPS, um die Manipulation von Quelldaten zu handhaben, um "Rauschen" in Daten zu entfernen, verbotene Spalten in Tabellen/DCR umzubenennen - und Unterstützung für Transparenz mit zusätzlichen Einblicken wie UserLoggedOn, CollectionTime, Computer:
Write-Output "" Write-Output "Collecting Bios information ... Please Wait !"
$DataVariable = Get-CimInstance -ClassName Win32_BIOS
#-------------------------------------------------------------------------------------------
#-------------------------------------------------------------------------------------------
$DataVariable = Convert-CimArrayToObjectFixStructure -data $DataVariable -Verbose:$Verbose
$DataVariable = Add-CollectionTimeToAllEntriesInArray -Data $DataVariable -Verbose:$Verbose
$DataVariable = Add-ColumnDataToAllEntriesInArray -Data $DataVariable -Column1Name Computer -Column1Data $Env:ComputerName -Column2Name UserLoggedOn -Column2Data $UserLoggedOn -Verbose:$Verbose
$DataVariable = Filter-ObjectExcludeProperty -Data $DataVariable -ExcludeProperty __*,SystemProperties,Scope,Qualifiers,Properties,ClassPath,Class,Derivation,Dynasty,Genus,Namespace,Path,Property_Count,RelPath,Server,Superclass -Verbose:$Verbose
Im Rahmen der Erstbereitstellung mit dem ClientInSpectorV2-DeploymentKit haben Sie Zugriff auf viele Azure-Dashboards und Azure Workbooks.
Die Idee der Dashboards ist, dass sie zeigen, wo Ihre Infrastruktur vom „gewünschten Zustand“ abweicht. Betrachten Sie sie als KPIs, bei denen die Infrastruktur nicht unter Kontrolle ist.
Anstatt sich mit Patchen und Antivirenverwaltung zu beschäftigen, können Sie KPIs betrachten, die zeigen, wo Computer nicht gepatcht sind – oder wo der Echtzeitschutz des Antivirenprogramms nicht läuft – oder Maschinen, die in den letzten 24 Stunden einen Bluescreen hatten.
Dies ist das gleiche Konzept wie der Microsoft Secure Score.















Link zur vollständigen Liste der bereitgestellten Azure Workbooks
Alle Beispiel-Azure-Dashboards basieren auf angehefteten Teilen aus Azure Workbooks. Wenn Sie also tiefer einsteigen möchten, können Sie auf einen Link klicken und erhalten Zugriff auf die detaillierten Informationen.

Link zu den bereitgestellten Azure Dashboards
Wenn Sie weitere Dashboards oder Workbooks hinzufügen möchten, beginnen Sie in der Regel damit, die gesammelten Daten in den benutzerdefinierten Protokolltabellen mithilfe von KQL-Abfragen zu untersuchen. Wenn Sie die gewünschte Abfrage gefunden haben, können Sie neue Ansichten in Workbooks erstellen und Ihre Favoriten an Ihre Dashboards anheften.
Wenn Sie die Kusto-Sprache nicht kennen, empfehle ich Ihnen, damit herumzuspielen, da es eine wirklich leistungsstarke Sprache ist.
Video 1m 58s – Kusto-Abfragen gegen Daten
Video 3m 01s – Dashboards
Schreiben Sie Ihre erste Abfrage mit der Kusto Query Language
Analysieren von Abfrageergebnissen mit KQL
Nachfolgend finden Sie 4 Beispielabfragen für den Einstieg – basierend auf den Daten von ClientInspector.
Wenn Sie erweiterte Suchvorgänge durchführen möchten, können Sie herkömmliche Kusto (KQL)-Abfragen in den Tabellen verwenden.
#----------------------------------------------------------------------------------------------------------------------
#----------------------------------------------------------------------------------------------------------------------
$LogAnalyticsWorkspaceId = "e74ca75a-c0e6-4933-a4f7-e5ae943fe4ac"
#----------------------------------------------------------------------------------------------------------------------
#---------------------------------------------------------------------------------------------------------------------- $Query = @' InvClientComputerInfoBiosV2_CL | summarize TimeGenerated = arg_max(TimeGenerated,) by Computer | join (InvClientComputerInfoSystemV2_CL | summarize TimeGenerated = arg_max(TimeGenerated,) by Computer) on $left.Computer == $right.Computer | join (InvClientComputerOSInfoV2_CL | summarize TimeGenerated = arg_max(TimeGenerated,*) by Computer) on $left.Computer == $right.Computer | project Computer, UserLoggedOn, SerialNumber, Manufacturer, PCSystemType, SystemFamily, Model, Windows=Caption2, WindowsVersion=Version1, TimeGenerated '@
write-output "Collecting computer information from LogAnalytics" $Query = Invoke-AzOperationalInsightsQuery -WorkspaceId $LogAnalyticsWorkspaceId -Query $Query $ComputerInfoArray = $Query.Results $ComputerInfoArray
</details>
## Beispielabfrage 4: Integration von Daten mit anderen Quellen (Garantieprüfung gegen Lenovo-Garantiedatenbank)
Wenn wir die Daten in Azure LogAnalytics haben, können wir beginnen, die Daten mit anderen Quellen zu integrieren, z.B. mit Dell- oder Lenovo-Garantiedaten über REST-API-Nachschlage.
[Video 0m 48s - Beispielverwendung der Daten - Abfrage der Lenovo-Garantiedatenbank](https://youtu.be/3ZDyTwiLU0w)
Hier ist ein Beispiel für eine Ausgabe, die automatisch von einem PowerShell-Skript erstellt wurde – extrahiert eine Liste von Computern & Seriennummern – und führt dann eine Abfrage der Lenovo-Garantiedatenbank durch, um Informationen darüber abzurufen, wann der Computer gekauft wurde – und seinen Garantiestatus.
[Beispiel-Garantieausgabe (Excel), basierend auf Daten, die von ClientInspector gesammelt wurden](https://github.com/KnudsenMorten/ClientInspectorV2/raw/main/img/WarrantyInfo.xlsx)
# Architektur, Schema und Netzwerk
ClientInspector (v2) lädt die gesammelten Daten in **Custom Logs** im **Azure LogAnalytics-Arbeitsbereich** hoch – unter Verwendung der **Log Ingestion API**, **Azure Data Collection Rules (DCR)** und **Azure Data Collection Endpoints (DCE)**.

## Schema
Sowohl die DCR als auch die LogAnalytics-Tabelle haben ein Schema, das mit dem Schema des Quellobjekts übereinstimmen muss. Dies wird durch die Verwendung von Funktionen im AzLogDcrIngestPS-Modul gehandhabt.
[Video 1m 40s - Automatische Erstellung von 2 Tabellen und DCRs (ausführlicher Modus)](https://youtu.be/rIUNs3yT-eI)
[Video 1m 37s - Automatische Erstellung von 2 Tabellen und DCRs (normaler Modus)](https://youtu.be/khQMDcON6r8)
[Video 1m 34s - Schema von DCR und Tabelle anzeigen](https://youtu.be/NDSNhvpa4Gs)
AzLogDcrIngestPS unterstützt 2 Modi zur Verwaltung des Schemas: **Merge** und **Overwrite**
### SchemaMode = Merge (Standard)
Wenn Sie SchemaMode = Merge setzen, werden neue Eigenschaften des Quellobjekts zum aktuellen Schema des Log Analytics hinzugefügt (zusammengeführt). Die DCR importiert das Schema aus der Log Analytics-Tabelle, um sicherzustellen, dass sie identisch sind.
Der Standardmodus ist Merge, wenn Sie die Variable SchemaMode in den Funktionen nicht definieren:
CheckCreateUpdate-TableDr-Structure
CreateUpdate-AzLogAnalyticsCustomLogTableDcr
CreateUpdate-AzDataCollectionRuleLogIngestCustomLog
### SchemaMode = Overwrite
Wenn Sie SchemaMode = Overwrite setzen, wird das Schema in der DCR und der Tabelle basierend auf dem Schema des Quellobjekts überschrieben (aktualisiert).
## Netzwerk
Sie haben 3 Optionen für die Konnektivität zu Azure für den Daten-Upload:
|Upload-Methode|Verbindungsdetails|Betriebssystem-Konformität|
|:------------|:-------------------|:------------|
|Öffentlicher Zugriff|REST-Endpunkt sendet an DCE über öffentliche IP des DCE|Endpunkt unterstützt TLS 1.2|
|Privater Zugriff|REST-Endpunkt sendet an DCE über Private Link des DCE|Endpunkt unterstützt TLS 1.2|
|Log-Hub|REST-Endpunkt sendet Daten über [log-hub](https://github.com/KnudsenMorten/AzLogDcrIngestPSLogHub) – ein von mir entwickeltes Konzept.|Endpunkt unterstützt TLS 1.2 nicht.<br> Azure akzeptiert keine Verbindungen von diesen Geräten direkt|
### Mit dem Internet verbundene Endpunkte – Betriebssystem-Konformität

Sie müssen die folgenden Endpunkte in Ihrer Firewall zulassen:
|Endpunkt|Zweck|Port|Richtung|HTTPS-Inspektion umgehen|
|:-------|:------|:----|:-------|:----------------------|
|global.handler.control.monitor.azure.com|Zugriffssteuerungsdienst|Port 443|Ausgehend|Ja|
|DCE Logs Ingestion URI<br><br>Beispiel<br>https://dce-log-platform-management-client-demo-p-iur0.westeurope-1.ingest.monitor.azure.com|Logdaten erfassen|Port 443|Ausgehend|Ja|
<br>
### Kein Internetzugang oder Betriebssystem-Inkompatibilität, z. B. bei Verwendung von TLS 1.0/1.1
[Informieren Sie sich über das Log-Hub-Konzept unter diesem Link](https://github.com/KnudsenMorten/AzLogDcrIngestPSLogHub)

<br>
# Implementierung
Hoffentlich werden Sie feststellen, dass es ziemlich einfach ist, alles zum Laufen zu bringen. Die 3 Schritte sind unten aufgeführt.
Bevor Sie beginnen, empfehle ich Ihnen, die Komponenten in der folgenden Einführung genauer zu lesen.
<details>
<summary>Einführung in die Azure-Komponenten, die im Rahmen von ClientInspector verwendet werden</summary>
<br>
Die folgenden Komponenten werden benötigt:
| Azure-Ressource | Zweck | Weitere Informationen |
| :------------- | :----- | :----- |
| Ein beliebiger REST-Endpunkt | Dies ist die Quelle, die Daten sendet | |
| Log Ingestion API | Dies ist die neue API, die die alte HTTP Data Collector API ersetzt | https://learn.microsoft.com/en-us/azure/azure-monitor/logs/logs-ingestion-api-overview |
| Data Collection Endpoint (DCE)| Dies ist der Einstiegspunkt für die Kommunikation vom Endpunkt. Daten werden an eine **Azure Data Collection Endpoint Ingestion Uri** gesendet. Ein einzelner DCE kann mehrere DCRs unterstützen, sodass Sie eine andere DCR für verschiedene Quellen und Zieltabellen angeben können. | https://learn.microsoft.com/en-us/azure/azure-monitor/essentials/data-collection-endpoint-overview?tabs=portal |
| Data Collection Rules (DCR) | Data Collection Rules definieren die gesammelten Daten (Schema) und legen fest, wie und wohin diese Daten gesendet oder gespeichert werden sollen. Die DCR muss die Struktur der Eingabedaten und die Struktur der Zieltabelle verstehen. Wenn beide nicht übereinstimmen, kann sie eine Transformation verwenden, um die Quelldaten an die Zieltabelle anzupassen. Sie können die Transformation auch verwenden, um Quelldaten zu filtern und andere Berechnungen oder Konvertierungen durchzuführen. | https://learn.microsoft.com/en-us/azure/azure-monitor/essentials/data-collection-rule-overview |
| Azure LogAnalytics-Arbeitsbereich | Daten werden an Custom Logs in Azure LogAnalytics gesendet | https://learn.microsoft.com/en-us/azure/azure-monitor/logs/log-analytics-overview |
| Azure Workbooks | Im Rahmen der Bereitstellung werden Beispiel-Workbooks bereitgestellt | https://learn.microsoft.com/en-us/azure/azure-monitor/visualize/workbooks-overview |
| Azure Dashboards | Im Rahmen der Bereitstellung werden Beispiel-Workbooks bereitgestellt | https://learn.microsoft.com/en-us/azure/azure-monitor/visualize/tutorial-logs-dashboards |
| Kusto (KQL) | Daten können mit Kusto (KQL)-Abfragen analysiert werden | https://learn.microsoft.com/en-us/azure/azure-monitor/logs/get-started-queries |
</details>
Die Schritte zur Einrichtung von ClientInspector in Ihrer Umgebung sind:
1. [Umgebung mit ClientInSpectorV2-DeploymentKit einrichten](https://github.com/KnudsenMorten/ClientInspectorV2-DeploymentKit)
2. ClientInspector zum ersten Mal ausführen (Ersteinrichtung) – siehe unten
<details>
<summary>So konfigurieren Sie die Ersteinrichtung von Azure LogAnalytics-Tabellen und Data Collection Rules (erstmalig)</summary>
<br>
Ich empfehle, einen Referenzcomputer zu verwenden, der für die Tabellen-/DCR-Verwaltung genutzt wird. Auf diese Weise ist es ein kontrollierter Prozess, falls Änderungen vorgenommen werden müssen – z. B. wenn sich das Schema des Quellobjekts ändert.
<br>
<br>
Konfiguration:
1. Wenn Sie das DeploymentKit ausführen, bereitet es automatisch die ClientInspector-Datei für Sie vor, sodass Sie nur noch die Variablen einfügen müssen```js
$TenantId = "xxxx"
$LogIngestAppId = "xxxx"
$LogIngestAppSecret = "xxxx"
$DceName = "xxxx"
$LogAnalyticsWorkspaceResourceId = "xxxx"
$AzDcrPrefixClient = "xxx"
$AzDcrSetLogIngestApiAppPermissionsDcrLevel = $false
$AzDcrLogIngestServicePrincipalObjectId = "xxx"
$AzDcrDceTableCreateFromReferenceMachine = @()
$AzDcrDceTableCreateFromAnyMachine = $true
Laden Sie das Erkennungsskript ClientInspector_Detection.ps1 herunter (Rechtsklick und 'Link speichern unter' wählen)
Öffnen Sie die Datei mit Ihrem bevorzugten Editor. Passen Sie die Häufigkeit an, wie oft das Inventar ausgeführt werden soll.```js ##################################
##################################
$RunEveryHours = 8
$LastRun_RegPath = "HKLM:\SOFTWARE\ClientInspector"
$LastRun_RegKey = "ClientInSpector_System"
3. Jetzt müssen wir den Korrektur-Job erstellen. Gehen Sie in das Microsoft Intune Portal -> Berichte -> Endpunktanalyse --> Proaktive Korrekturen – und erstellen Sie ein Skriptpaket wie unten gezeigt
HINWEIS: Für das Korrektur-Skript verwenden Sie die Datei **ClientInspector.ps1**


### Einschränkung von Intune
HINWEIS: Intune hat eine Größenbeschränkung von 200 Kb für ein Korrektur-Skript.

Falls Sie diese Grenze erreichen, empfehle ich, das Skript in 2 Skripte aufzuteilen.


Denken Sie daran, den Header-Bereich einschließlich des UserLoggedOn-Abschnitts als Header der zweiten Datei einzufügen. UserLoggedOn wird verwendet, um anzuzeigen, welcher Benutzer angemeldet ist.
Ich habe ein [Beispiel-Skript-Setup](https://github.com/KnudsenMorten/ClientInspectorV2/tree/main/Sample%20intune%20setup%20if%20file%20size%20is%20more%20than%20200%20Kb) vorbereitet, in dem Sie sehen können, wie man sie trennt. Hinweis: Der Code ist in diesen Skripten NICHT aktualisiert. Stellen Sie daher sicher, dass Sie die Abschnitte aus der Haupt-ClientInspector-Datei übernehmen.
Im Grunde ist die Struktur wie folgt:
Datei 1 enthält Header + UserLoggedOn (Abschnitt 1) + Abschnitt 2-9 + schreibt Check-Flag in HKLM\Software\ClientInspector\ClientInspector_System_1
Datei 2 enthält Header + UserLoggedOn (Abschnitt 1) + Abschnitt 10-18 + schreibt Check-Flag in HKLM\Software\ClientInspector\ClientInspector_System_2



</details>
<details>
<summary>Wie bereitstellen mit ConfigMgr (oder einem anderen Tool, das eine CMD-Datei ausführt)?</summary>
<br>
Sie führen das Inventarskript über ein traditionelles Paket + Bereitstellung aus.
1. [Laden Sie die CMD-Datei ClientInspector.cmd herunter](https://github.com/KnudsenMorten/ClientInspectorV2/raw/main/ConfigMgr/ClientInspector.cmd) (Rechtsklick und 'Ziel speichern unter' wählen)
2. Erstellen Sie eine Quellstruktur in Ihrem ConfigMgr-Paketquellverzeichnis, z. B. mit dem Namen ClientInspector.
3. Kopieren Sie die beiden benötigten Dateien **ClientInspector.cmd** und **ClientInspector.ps1** in das Verzeichnis
4. Erstellen Sie ein Paket – und weisen Sie das Paket an, **ClientInspector.cmd** auszuführen.
5. Erstellen Sie eine Bereitstellung
</details>
<br>
# Abhängigkeiten
## Powershell-Modul AzLogDcringestPS – von mir erstellt (Morten Knudsen)
ClientInspector benötigt das Powershell-Modul **AzLogDcrIngestPS**
Die Kernfunktionen des Powershell-Moduls **AzLogDcrIngestPS** umfassen:
* Automatisches Erstellen/Aktualisieren der DCRs und Tabellen basierend auf dem Quellobjektschema
* Validieren des Schemas auf Probleme mit Namenskonventionen. Falls solche gefunden werden, werden die Probleme behoben
* Aktualisieren des Schemas von DCRs und Tabellen, falls sich die Struktur des Quellobjekts ändert
* Automatische Reparatur, falls etwas mit einer DCR oder Tabelle schiefgeht
* Entfernen von Daten aus dem Quellobjekt, wenn Sie Spalten mit Daten, die Sie nicht senden möchten, entfernen möchten
* Konvertieren von Quellobjekten basierend auf CIM- oder PS-Objekten in PSCustomObjects/Array
* Hinzufügen relevanter Informationen zu jedem Datensatz wie UserLoggedOn, Computer, CollectionTime
Weitere detaillierte Informationen zum Modul finden Sie unter den folgenden Links:
[AzLogDcrIngestPS (Github)](https://github.com/KnudsenMorten/AzLogDcrIngestPS)
[AzLogDcrIngestPS (Powershell Gallery)](https://www.powershellgallery.com/packages/AzLogDcrIngestPS)
[AzLogDcrIngestPSLogHub (Github)](https://github.com/KnudsenMorten/AzLogDcrIngestPSLogHub)
<br>
## Powershell-Module von Drittanbietern
Ich ziehe es vor, Windows Update-Informationen mit einem bekannten Powershell-Modul, PSWindowsUpdate, abzurufen.
|Modulname|Zweck|Weitere Informationen|Autor|
|:---------|:------|:--------|:-----|
|NuGet|Allgemeiner Paketanbieter, der zum Bereitstellen vieler Powershell-Module verwendet wird, einschließlich AzLogDcrIngestPS<br><br>Der Paketanbieter wird beim Ausführen des Skripts automatisch auf dem Computer installiert|[Link](https://www.nuget.org/packages)|
|PSWindowsUpdate|Sammlung von Windows Update-Informationen (ausstehende Updates, installierte Updates usw.)<br><br>Das Modul wird beim Ausführen des Skripts automatisch auf dem Computer installiert|[Link](https://www.powershellgallery.com/packages/PSWindowsUpdate)|Michal Gajda
<br>
# Ausführen von ClientInspector.ps1 – 3 Modi
ClientInspector unterstützt 3 Möglichkeiten zum Installieren/Aktualisieren/Importieren des benötigten Powershell-Moduls: **Download**, **PsGallery**, **LocalPath**
Standardmäßig wird die neueste Version von PsGallery in den CurrentUser-Bereich heruntergeladen.
[Video 3m 19s – Ausführen von ClientInspector über die Befehlszeile (normaler Modus)](https://youtu.be/4kA4BE0zJ9g)
## .\ClientInspector.ps1 -function:LocalPath
ClientInspector sucht nach der Datei **AzLogDcrIngest.psm1** im Verzeichnis, aus dem das Skript ausgeführt wird.
Wenn AzLogDcrIngest.psm1 fehlt, wird das Skript beendet – andernfalls wird ein Import-Module durchgeführt.
Beispiel```
.\ClientInspector.ps1 -verbose:$false -function:localpath
ClientInspector | Inventory of Operational & Security-related information
Developed by Morten Knudsen, Microsoft MVP - for free community use
Using AzLogDcrIngestPS module from local path D:\scripts\ClientInspectorV2
$DataVariable = ValidateFix-AzLogAnalyticsTableSchemaColumnNames -Data $DataVariable -Verbose:$Verbose
$DataVariable = Build-DataArrayToAlignWithSchema -Data $DataVariable -Verbose:$Verbose
Sie können das Quellobjekt überprüfen, indem Sie diesen Befehl ausführen.````
# Get insight about the schema structure of an object BEFORE changes. Command is only needed to verify columns in schema
Get-ObjectSchemaAsArray -Data $DataVariable -Verbose:$Verbose







Starten Sie PowerShell als lokaler Administrator
Starten Sie das Skript mit diesem Befehl```js C:\ClientInspector\ClientInspector.ps1 -verbose:$true
4. ClientInspector wird 10-20 Minuten lang ausgeführt und erstellt die notwendigen Tabellen & Data Collection Rules – basierend auf der tatsächlichen Struktur in Ihrer Umgebung. Bitte gehen Sie die Ergebnisse auf dem Bildschirm durch und achten Sie auf Fehler (rot).
5. Wenn alles gut aussieht, führen Sie das Skript erneut aus. Es wird dann viel schneller durchlaufen. Überprüfen Sie mit Kusto-Abfragen in den verschiedenen Tabellen, ob Daten eingehen. HINWEIS: Der erste Upload der Daten kann ca. 10-15 Minuten dauern, da die Pipeline im Backend erstellt werden muss.
6. Als letzte Änderung müssen wir 2 Parameter in den Parametern ändern, um ClientInspector mitzuteilen, Schemaänderungen nur dann vorzunehmen, wenn das Skript auf dem Referenzrechner ausgeführt wird.```js
$AzLogDcrTableCreateFromReferenceMachine = @("<<MyReferenceMachineComputerName>>") # sample @("ComputerName")
$AzLogDcrTableCreateFromAnyMachine = $false # important so changes can only happen on reference machine
ClientInspector lädt bei jeder Ausführung die neueste Version aus meinem Github-Repo herunter und speichert sie im lokalen Pfad (ca. 300 kb).
Beispiel``` .\ClientInspector.ps1 -verbose:$false -function:download
ClientInspector | Inventory of Operational & Security-related information Developed by Morten Knudsen, Microsoft MVP - for free community use
Downloading latest version of module AzLogDcrIngestPS from https://github.com/KnudsenMorten/CientInspectorV2 into local path D:\scripts\ClientInspectorV2
## .\ClientInspector.ps1 -function:PsGallery -scope [AllUsers|CurrentUser]
Dieser Parameter erfordert einen weiteren Parameter: -scope [AllUsers | CurrentUser]
ClientInspector prüft, ob das Modul im gewählten Bereich installiert ist.
Falls nicht installiert, wird automatisch die neueste Version aus der PowerShell Gallery heruntergeladen und das Modul importiert.
Wenn der Client die neueste Version ausführt, wird fortgefahren.
Beispiel```
.\ClientInspector.ps1 -verbose:$false -function:PSGallery -scope:CurrentUser
ClientInspector | Inventory of Operational & Security-related information
Developed by Morten Knudsen, Microsoft MVP - for free community use
Powershell module was not found !
Installing in scope currentuser .... Please Wait !
ClientInspector | Inventory of Operational & Security-related information Developed by Morten Knudsen, Microsoft MVP - for free community use
Checking latest version at PsGallery for AzLogDcrIngestPS module OK - Running latest version
</details>
<br>
## Beispielausgabe von ClientInspector
[Video 3m 19s - Ausführen von ClientInspector über die Befehlszeile (normaler Modus)](https://youtu.be/4kA4BE0zJ9g)
<br>
# Sicherheit
## Codesignatur
Sowohl die **ClientInspector.ps1-Datei** als auch das **AzLogDcrIngestPS-Modul (AzLogDcrIngest.psm1)** sind mit meinem Codesignaturzertifikat (2LINKIT – mein Unternehmen) signiert. Auf diese Weise können Sie es ausführen, wenn Sie signierte Skripte benötigen. Sie können es natürlich auch mit Ihrem eigenen internen Codesignaturzertifikat signieren.

Bitte [laden Sie das öffentliche Schlüsselzertifikat herunter](https://github.com/KnudsenMorten/ClientInspectorV2/raw/main/Trusted_Publisher_Certificate/2LINKIT-TrustedPublisher.cer) und legen Sie es in Ihren 'trusted publisher'-Container, um dem Herausgeber (2LINKIT – mein Unternehmen) zu vertrauen. Sie können dies mit Intune oder Gruppenrichtlinien bereitstellen.



### Intune-Bereitstellung erfordert keinen vorhandenen vertrauenswürdigen Herausgeber
Standardmäßig führt Intune beim Ausführen von Korrekturskripten einen BYPASS durch.
## Struktur
Die Sicherheit von **ClientInspector** ist in 4 Schichten unterteilt: **Dateneingabe**, **Datenhochladen** (an das Backend senden) und **Datenansicht** (Dashboards) – sowie **Schemaverwaltung**
| Phase | Sicherheitsimplementierung |Delegierungen / Berechtigungen|
|:------|:------------------------|:------------------------|
|Dateneingabe (Sammlung)|Diese Phase wird durch die von Ihnen gewählte Methode zur Durchführung der tatsächlichen Sammlung gesteuert (Intune, ConfigMg oder andere Drittanbieter)|Das Skript muss als lokaler Administrator (Systemkontext) ausgeführt werden, um Kerndaten von Hardware und Windows sammeln zu können|
|Datenhochladen|Die Authentifizierung für die Logs Ingestion API erfolgt am DCE, das die standardmäßige Azure Resource Manager-Authentifizierung verwendet.<br><br>Eine gängige Strategie ist die Verwendung einer Anwendungs-ID und eines Anwendungsschlüssels, was auch die in ClientInspector verwendete Methode ist.<br><br>Azure AppId und Secret werden aus Gründen der Einfachheit im Header von ClientInspector gespeichert.<br><br>Es ist auch möglich, Azure Keyvault zum Speichern der AppId und des Secrets zu verwenden|[Details im ClientInspectV2-DeploymentKit behandelt](https://github.com/KnudsenMorten/ClientInspectorV2-DeploymentKit#security-1)|
|Datenansicht|Azure RCAC-Berechtigungen|Gewähren Sie Zugriff auf Ihre Azure LogAnalytics, Azure Workbooks und Azure Dashboards|
|Schemaverwaltung|Methode 1: Azure RBAC (empfohlen)<br><br>Methode 2: Azure-App mit Secret oder Zertifikat|[Details im ClientInSpectorV2-DeploymentKit behandelt](https://github.com/KnudsenMorten/ClientInspectorV2-DeploymentKit#azure-rbac-security-adjustment-separation-of-permissions-between-log-ingestion-and-tabledcr-management)|
<br>
# Layout des ClientInspector-Datensatzes
Jeder der Datensätze (BIOS, Anwendungen, BitLocker usw.) ist mit derselben 4-phasigen Struktur aufgebaut:
## Phase 1/4 – Variablen (Benennung – wohin die Daten gesendet werden sollen)```
#-------------------------------------------------------------------------------------------
# Variables
#-------------------------------------------------------------------------------------------
$TableName = 'InvClientComputerInfoSystemV2' # must not contain _CL
$DcrName = "dcr-" + $AzDcrPrefixClient + "-" + $TableName + "_CL"
#-------------------------------------------------------------------------------------------
#-------------------------------------------------------------------------------------------
Write-Output "" Write-Output "Collecting Computer system information ... Please Wait !"
$DataVariable = Get-CimInstance -ClassName Win32_ComputerSystem
## Phase 3/4 - Datenmanipulation (sicherstellen, dass die Daten im richtigen Format vorliegen und jegliches "Rauschen" entfernt wird sowie relevante Informationen hinzugefügt werden)```
#-------------------------------------------------------------------------------------------
# Preparing data structure
#-------------------------------------------------------------------------------------------
# convert CIM array to PSCustomObject and remove CIM class information
$DataVariable = Convert-CimArrayToObjectFixStructure -data $DataVariable -Verbose:$Verbose
# add CollectionTime to existing array
$DataVariable = Add-CollectionTimeToAllEntriesInArray -Data $DataVariable -Verbose:$Verbose
# add Computer & UserLoggedOn info to existing array
$DataVariable = Add-ColumnDataToAllEntriesInArray -Data $DataVariable -Column1Name Computer -Column1Data $Env:ComputerName -Column2Name UserLoggedOn -Column2Data $UserLoggedOn
# Validating/fixing schema data structure of source data
$DataVariable = ValidateFix-AzLogAnalyticsTableSchemaColumnNames -Data $DataVariable -Verbose:$Verbose
# Aligning data structure with schema (requirement for DCR)
$DataVariable = Build-DataArrayToAlignWithSchema -Data $DataVariable -Verbose:$Verbose
#-------------------------------------------------------------------------------------------
#-------------------------------------------------------------------------------------------
CheckCreateUpdate-TableDcr-Structure -AzLogWorkspaceResourceId $LogAnalyticsWorkspaceResourceId -SchemaMode Merge -AzAppId $LogIngestAppId -AzAppSecret $LogIngestAppSecret -TenantId $TenantId -Verbose:$Verbose
-DceName $DceName -DcrName $DcrName -TableName $TableName -Data $DataVariable -LogIngestServicePricipleObjectId $AzDcrLogIngestServicePrincipalObjectId
-AzDcrSetLogIngestApiAppPermissionsDcrLevel $AzDcrSetLogIngestApiAppPermissionsDcrLevel -AzLogDcrTableCreateFromAnyMachine $AzLogDcrTableCreateFromAnyMachine
-AzLogDcrTableCreateFromReferenceMachine $AzLogDcrTableCreateFromReferenceMachine
#-----------------------------------------------------------------------------------------------
#-----------------------------------------------------------------------------------------------
Post-AzLogAnalyticsLogIngestCustomLogDcrDce-Output -DceName $DceName -DcrName $DcrName -Data $DataVariable -TableName $TableName ` -AzAppId $LogIngestAppId -AzAppSecret $LogIngestAppSecret -TenantId $TenantId -Verbose:$Verbose
<br>
**TIPP: Fehler 513 - Entität ist zu groß**
Standardmäßig sendet ClientInspector die Daten in Stapeln, basierend auf einer berechneten durchschnittlichen Größe pro Datensatz. Falls Ihr Datensatz unterschiedliche Größen aufweist, kann der Fehler 513 auftreten.
Ursache ist, dass Sie die Beschränkung von 1 MB pro Upload erreicht haben (Azure Pipeline-Beschränkung). Microsoft möchte viele kleinere Datenblöcke empfangen, da es sich um eine gemeinsam genutzte Umgebung handelt. Ich habe dieses Problem beim Abrufen der Liste aller installierten Anwendungen gesehen. Offenbar speichern die Anwendungen Informationen mit sehr unterschiedlichem Größenumfang.
Sie können dieses Problem umgehen, indem Sie den Parameter **-BatchAmount <Anzahl der pro Stapel zu sendenden Datensätze>** zum Post-command hinzufügen. Um sicherzugehen, setzen Sie ihn auf 1.```
Post-AzLogAnalyticsLogIngestCustomLogDcrDce-Output -DceName $DceName `
-DcrName $DcrName `
-Data $DataVariable `
-TableName $TableName `
-AzAppId $LogIngestAppId `
-AzAppSecret $LogIngestAppSecret `
-TenantId $TenantId `
-BatchAmount 1 `
-Verbose:$Verbose `
#-----------------------------------------------------------------------------------------------
#-----------------------------------------------------------------------------------------------
$Schema = Get-ObjectSchemaAsArray -Data $Data
$StructureCheck = Get-AzLogAnalyticsTableAzDataCollectionRuleStatus -AzLogWorkspaceResourceId $AzLogWorkspaceResourceId -TableName $TableName
-DcrName $DcrName -SchemaSourceObject $Schema
-SchemaMode $SchemaMode
-AzAppId $AzAppId -AzAppSecret $AzAppSecret
-TenantId $TenantId `
-Verbose:$Verbose
#-----------------------------------------------------------------------------------------------
#-----------------------------------------------------------------------------------------------
$Schema = Get-ObjectSchemaAsHash -Data $Data -ReturnType Table
-Verbose:$Verbose
CreateUpdate-AzLogAnalyticsCustomLogTableDcr -AzLogWorkspaceResourceId $AzLogWorkspaceResourceId -SchemaSourceObject $Schema
-SchemaMode $SchemaMode
-TableName $TableName -AzAppId $AzAppId
-AzAppSecret $AzAppSecret -TenantId $TenantId
-Verbose:$Verbose
$Schema = Get-ObjectSchemaAsHash -Data $Data -ReturnType DCR
CreateUpdate-AzDataCollectionRuleLogIngestCustomLog -AzLogWorkspaceResourceId $AzLogWorkspaceResourceId -SchemaSourceObject $Schema
-SchemaMode $SchemaMode
-DceName $DceName -DcrName $DcrName
-TableName $TableName -LogIngestServicePricipleObjectId $LogIngestServicePricipleObjectId
-AzDcrSetLogIngestApiAppPermissionsDcrLevel $AzDcrSetLogIngestApiAppPermissionsDcrLevel -AzAppId $AzAppId
-AzAppSecret $AzAppSecret -TenantId $TenantId
-Verbose:$Verbose
$AzDcrDceDetails = Get-AzDcrDceDetails -DcrName $DcrName -DceName $DceName
-AzAppId $AzAppId -AzAppSecret $AzAppSecret
-TenantId $TenantId `
-Verbose:$Verbose
Post-AzLogAnalyticsLogIngestCustomLogDcrDce -DceUri $AzDcrDceDetails[2] -DcrImmutableId $AzDcrDceDetails[6]
-TableName $TableName -DcrStream $AzDcrDceDetails[7]
-Data $Data -BatchAmount $BatchAmount
-AzAppId $AzAppId -AzAppSecret $AzAppSecret
-TenantId $TenantId `
-Verbose:$Verbose
<br>
# Verbose-Modus & Weitere Hilfe
Wenn Sie detailliertere Informationen darüber erhalten möchten, was passiert, können Sie den Verbose-Modus aktivieren (-verbose:$true)```
.\ClientInspector.ps1 -verbose:$true -function:localpath
Wenn Sie es vorziehen, mit Powershell ISE zu testen, können Sie auch den Verbose-Modus mit der Variable $Verbose aktivieren.``` $Verbose = $false # can be $true or $false
Wenn Sie Hilfe mit der Syntax und den Beispielen aus dem Modul AzLogDcrLogIngestPS erhalten möchten, können Sie get-module eingeben```
PS get-command -module AzLogDcrIngestPS
CommandType Name Version Source
----------- ---- ------- ------
Function Add-CollectionTimeToAllEntriesInArray 1.1.17 AzLogDcrIngestPS
Function Add-ColumnDataToAllEntriesInArray 1.1.17 AzLogDcrIngestPS
Function Build-DataArrayToAlignWithSchema 1.1.17 AzLogDcrIngestPS
Function CheckCreateUpdate-TableDcr-Structure 1.1.17 AzLogDcrIngestPS
Function Convert-CimArrayToObjectFixStructure 1.1.17 AzLogDcrIngestPS
Function Convert-PSArrayToObjectFixStructure 1.1.17 AzLogDcrIngestPS
Function CreateUpdate-AzDataCollectionRuleLogIngestCusto... 1.1.17 AzLogDcrIngestPS
Function CreateUpdate-AzLogAnalyticsCustomLogTableDcr 1.1.17 AzLogDcrIngestPS
Function Delete-AzDataCollectionRules 1.1.17 AzLogDcrIngestPS
Function Delete-AzLogAnalyticsCustomLogTables 1.1.17 AzLogDcrIngestPS
Function Filter-ObjectExcludeProperty 1.1.17 AzLogDcrIngestPS
Function Get-AzAccessTokenManagement 1.1.17 AzLogDcrIngestPS
Function Get-AzDceListAll 1.1.17 AzLogDcrIngestPS
Function Get-AzDcrDceDetails 1.1.17 AzLogDcrIngestPS
Function Get-AzDataCollectionRuleTransformKql 1.1.17 AzLogDcrIngestPS
Function Get-AzDcrListAll 1.1.17 AzLogDcrIngestPS
Function Get-AzLogAnalyticsTableAzDataCollectionRuleStatus 1.1.17 AzLogDcrIngestPS
Function Get-ObjectSchemaAsArray 1.1.17 AzLogDcrIngestPS
Function Get-ObjectSchemaAsHash 1.1.17 AzLogDcrIngestPS
Function Post-AzLogAnalyticsLogIngestCustomLogDcrDce 1.1.17 AzLogDcrIngestPS
Function Post-AzLogAnalyticsLogIngestCustomLogDcrDce-Output 1.1.17 AzLogDcrIngestPS
Function Update-AzDataCollectionRuleDceEndpoint 1.1.17 AzLogDcrIngestPS
Function Update-AzDataCollectionRuleResetTransformKqlDef... 1.1.17 AzLogDcrIngestPS
Function Update-AzDataCollectionRuleTransformKql 1.1.17 AzLogDcrIngestPS
Function ValidateFix-AzLogAnalyticsTableSchemaColumnNames 1.1.17 AzLogDcrIngestPS
Hilfe zu einem bestimmten Cmdlet erhalten - get-help Add-CollectionTimeToAllEntriesInArray -full``` get-help Add-CollectionTimeToAllEntriesInArray -full
NAME Add-CollectionTimeToAllEntriesInArray
SYNOPSIS Add property CollectionTime (based on current time) to all entries on the object
SYNTAX Add-CollectionTimeToAllEntriesInArray [-Data] []
DESCRIPTION Gives capability to do proper searching in queries to find latest set of records with same collection time Time Generated cannot be used when you are sending data in batches, as TimeGenerated will change An example where this is important is a complete list of applications for a computer. We want all applications to show up when queriying for the latest data
PARAMETERS -Data Object to modify
Required? true
Position? 1
Default value
Accept pipeline input? false
Accept wildcard characters? false
<CommonParameters>
This cmdlet supports the common parameters: Verbose, Debug,
ErrorAction, ErrorVariable, WarningAction, WarningVariable,
OutBuffer, PipelineVariable, and OutVariable. For more information, see
about_CommonParameters (https:/go.microsoft.com/fwlink/?LinkID=113216).
INPUTS None. You cannot pipe objects
OUTPUTS Updated object with CollectionTime
-------------------------- EXAMPLE 1 --------------------------
PS C:\>#-------------------------------------------------------------------------------------------
# Variables
#-------------------------------------------------------------------------------------------
$Verbose = $true # $true or $false
#-------------------------------------------------------------------------------------------
# Collecting data (in)
#-------------------------------------------------------------------------------------------
$DNSName = (Get-CimInstance win32_computersystem).DNSHostName +"." + (Get-CimInstance win32_computersystem).Domain
$ComputerName = (Get-CimInstance win32_computersystem).DNSHostName
[datetime]$CollectionTime = ( Get-date ([datetime]::Now.ToUniversalTime()) -format "yyyy-MM-ddTHH:mm:ssK" )
$UserLoggedOnRaw = Get-Process -IncludeUserName -Name explorer | Select-Object UserName -Unique
$UserLoggedOn = $UserLoggedOnRaw.UserName
$DataVariable = Get-CimInstance -ClassName Win32_Processor | Select-Object -ExcludeProperty "CIM*"
#-------------------------------------------------------------------------------------------
# Preparing data structure
#-------------------------------------------------------------------------------------------
$DataVariable = Convert-CimArrayToObjectFixStructure -data $DataVariable -Verbose:$Verbose
$DataVariable
# add CollectionTime to existing array
$DataVariable = Add-CollectionTimeToAllEntriesInArray -Data $DataVariable -Verbose:$Verbose
$DataVariable
#-------------------------------------------------------------------------------------------
# Output
#-------------------------------------------------------------------------------------------
VERBOSE: Adding CollectionTime to all entries in array .... please wait !
Caption : Intel64 Family 6 Model 165 Stepping 5
Description : Intel64 Family 6 Model 165 Stepping 5
InstallDate :
Name : Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz
Status : OK
Availability : 3
ConfigManagerErrorCode :
ConfigManagerUserConfig :
CreationClassName : Win32_Processor
DeviceID : CPU0
ErrorCleared :
ErrorDescription :
LastErrorCode :
PNPDeviceID :
PowerManagementCapabilities :
PowerManagementSupported : False
StatusInfo : 3
SystemCreationClassName : Win32_ComputerSystem
SystemName : STRV-MOK-DT-02
AddressWidth : 64
CurrentClockSpeed : 2904
DataWidth : 64
Family : 198
LoadPercentage : 1
MaxClockSpeed : 2904
OtherFamilyDescription :
Role : CPU
Stepping :
UniqueId :
UpgradeMethod : 1
Architecture : 9
AssetTag : To Be Filled By O.E.M.
Characteristics : 252
CpuStatus : 1
CurrentVoltage : 8
ExtClock : 100
L2CacheSize : 2048
L2CacheSpeed :
L3CacheSize : 16384
L3CacheSpeed : 0
Level : 6
Manufacturer : GenuineIntel
NumberOfCores : 8
NumberOfEnabledCore : 8
NumberOfLogicalProcessors : 16
PartNumber : To Be Filled By O.E.M.
ProcessorId : BFEBFBFF000A0655
ProcessorType : 3
Revision :
SecondLevelAddressTranslationExtensions : False
SerialNumber : To Be Filled By O.E.M.
SocketDesignation : U3E1
ThreadCount : 16
Version :
VirtualizationFirmwareEnabled : False
VMMonitorModeExtensions : False
VoltageCaps :
PSComputerName :
CollectionTime : 12-03-2023 16:08:33
RELATED LINKS https://github.com/KnudsenMorten/AzLogDcrIngestPS
<br>
# Kosten - Wie viel kostet die Speicherung dieser Daten?
Daten von **500** Clients, die **täglich** eine ClientInspector-Inventur durchführen, kosten ca. **DKK 200 pro Monat / USD 27 pro Monat**
<br>
# Fehler/Befunde, bitte informieren Sie mich
Derzeit wird ClientInspectorV1 auf Tausenden von Computern (und ServerInspectorV1 auf Tausenden von Servern) eingesetzt.
Da ClientInspectorV2 eine vollständige Neuerstellung von V1 ist, die jetzt z.B. mit einer neuen Namenskonvention ausgerollt wird, kann ich nicht versprechen, dass keine Fehler gefunden werden.
Aber **ich kann Ihnen versprechen**, dass ich sie so schnell beheben werde, wie es meine Freizeit erlaubt. Bitte senden Sie mir Ihre Befunde per E-Mail an [email protected].
Ziehen Sie in Betracht, die Github-Seite zu forken – oder behalten Sie die Updates in den Dashboards/Workbooks oder dem ClientInspector-Skript im Auge.
Darüber hinaus ist ClientInspector so konzipiert, dass es verschiedene Designs und Plattformen abdeckt, aber Sie können Konfigurationen haben, die einzigartig sind und nicht von Sammlungen oder Dashboards abgedeckt werden.
Aber der offene Ansatz ermöglicht es Ihnen, sowohl die Dashboards, Workbooks als auch das ClientInspector-Skript anzupassen, sodass es zu 100 % für Sie funktioniert. Betrachten Sie es als eine Showcase, um mehr mit Azure-Protokollierungstechnologien zu machen – es ist kein kostenpflichtiges Produkt mit 24x7-Support. Es ist für alle kostenlos!
<br>
# Kontakt
Wenn Sie Kommentare zur Lösung haben – oder einfach mit mir in Kontakt treten möchten, kontaktieren Sie mich bitte über diese Kanäle – ich würde mich über eine Verbindung freuen:
[Github](https://github.com/KnudsenMorten)
[Twitter](https://twitter.com/knudsenmortendk)
[Blog](https://mortenknudsen.net/)
[LinkedIn](https://www.linkedin.com/in/mortenwaltorpknudsen/)
[Microsoft MVP-Profil](https://mvp.microsoft.com/en-us/PublicProfile/5005156?fullName=Morten%20Knudsen)
[Sessionize](https://sessionize.com/mortenknudsen/)
[E-Mail](mailto:[email protected])
<br>
# Großer Dank an die großartigen Menschen in den Microsoft-Produktteams – ihr seid Rockstars :smile:
Zu guter Letzt möchte ich einigen Personen großen Dank aussprechen, mit denen ich bei der Entwicklung des AzLogDcrIngestPS Powershell-Moduls und meiner täglichen Arbeit mit den Azure-Protokollierungs- und Anzeigefunktionen zusammengearbeitet habe:
|Name|Rolle|
|:---|:---|
|Ivan Varnitski|Programmmanager - Azure Pipeline|
|Evgeny Ternovsky|Programmmanager - Azure Pipeline|
|Nick Kiest|Programmmanager - Azure Data Collection Rules|
|Oren Salzberg|Programmmanager - Azure LogAnalytics|
|Guy Wild|Technischer Redakteur - Azure LogAnalytics|
|John Gardner|Programmmanager - Azure Workbooks|
|Shikha Jain|Programmmanager - Azure Workbooks|
|Shayoni Seth|Programmmanager - Azure Monitor Agent|
|Jeff Wolford|Programmmanager - Azure Monitor Agent|
|Xema Pathak|Programmmanager - Azure VMInsight (Integration in Azure Monitor Agent)|
