NinjaOne RMM: VM-Hosts auf dem VM-Client anzeigen m. Github sync.
NinjaOne RMM ermöglicht jetzt die Anzeige des VM-Hosts auf dem VM-Client mit einem cleveren Skript, das auf einem sicheren Datenspeicher basiert.
Das Verwalten von virtuellen Maschinen (VMs) ist im Alltag eines IT-Administrators unerlässlich. Oftmals besteht der Wunsch, den VM-Host auf dem VM-Client anzuzeigen, um einen besseren Überblick und eine schnellere Identifizierung der zugehörigen Hosts zu ermöglichen. Um diesen Wunsch Realität werden zu lassen, haben wir ein Skript entwickelt, das NinjaOne RMM und seinen Custom-Feldern (benutzerdefinierten Feldern) genau das erlaubt.
Sicherer Datenspeicher
Um die Funktionalität bereitzustellen, war es notwendig, einen sicheren Datenspeicher zu finden, der bei jedem Kunden funktioniert. Die Wahl fiel auf Microsoft GitHub, das mehrfach sicherheitszertifiziert, kostenlos und einfach anzusprechen ist und damit eine hervorragende Grundlage für unsere Lösung bietet. https://github.com/security
Um das Skript optimal nutzen zu können, müssen zunächst Custom-Felder erstellt werden. Eine ausführliche Anleitung dazu finden Sie in diesem Blogbeitrag: [Erweiterte Anwendungsmöglichkeiten für benutzerdefinierte Felder in NinjaOne Teil 1](https://www.ninjaone.com/de/blog/erweiterte-anwendungsmoeglichkeiten-fuer-benutzerdefinierte-felder-in-ninjaone-teil1/).
Die Skripts im Detail
Zunächst erfasst ein Skript alle VMs auf einem Hyper-V-Host und listet sie auf. Anschließend schreibt es diese Informationen in den sicheren Datenspeicher bei GitHub. Dank seiner Flexibilität kann das Skript bei Bedarf auch erweitert werden, um die VM-Informationen in anderen Speicherorten abzulegen.
Sobald die VM-Informationen gespeichert sind, können sie auf dem Client ausgelesen und dem entsprechenden VM-Host zugeordnet werden. Die Funktion "SearchVMHost" ermittelt den Hostnamen der lokalen Maschine und sucht ihn in den gespeicherten Dateiinhalten. Schließlich schreibt die Funktion "WriteToNinjaOne" die VM-Host-Informationen in das zuvor erstellte NinjaOne-Eigenschaftsfeld.
Mit Hilfe des Skripts wird es also möglich, VM-Hosts und VM-Clients einfach und effizient zu verbinden, wodurch die Arbeit von IT-Administratoren erleichtert und optimiert wird.
Denken Sie daran, dass Sie die Variablen "Github-Geheimnis", "OWNER" und "REPO" anpassen müssen, damit das Skript korrekt funktioniert. Die Scripte können geplant laufen. Das eine auf dem HYPER-V Host und das andere auf dem VM Gast.
HOST
# Made for not only for NinjaOne
# Axel Christian Lenz
# https://www.linkedin.com/in/axellenz/
################## ANPASSEN!!!##############################
$global:pat = ""
$global:owner = ""
# Dies ist eine Funktion, die alle VMs auf einem Hyper-V-Host erfasst.
function GetVMInventory {
# "Get-VM" ist ein PowerShell-Cmdlet, das alle VMs auf dem Host auflistet.Write Guest VMs to the Host field
# Wir müssen sicherstellen, dass diese Funktion auf dem Hyper-V-Host ausgeführt wird.
$VMs = Get-VM
return $VMs
}
function WriteGitHubFile($repo, $path, $content) {
$base64Content = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($content))
$body = @{
"message" = "update $path"
"committer" = @{
"name" = $owner
"email" = "[email protected]"
}
"content" = $base64Content
} | ConvertTo-Json
try {
Invoke-RestMethod -Method Put -Uri "https://api.github.com/repos/$owner/$repo/contents/$path" -Headers @{Authorization = "token $pat"} -Body $body
} catch {
Write-Host "An error occurred: $_"
}
}
# Dies ist eine Funktion, die die VM-Inventarliste in eine Textdatei auf einem Netzlaufwerk schreibt.
function WriteInventoryToNDrive {
param($VMs)
$path = "\\XXXSRVFS01\Austausch\NinjaOne\Scripting\SRVVMHOST\$($env:COMPUTERNAME).txt"
if (Test-Path $path) {
Remove-Item $path
}
foreach ($VM in $VMs) {
Add-Content -Path $path -Value $VM.Name
}
}
function WriteInventoryToGithub {
param($VMs)
$repo = "NinjaScriptingStore"
################## ANPASSEN!!! #######################################
$path = "LZR/SRVVMHOSTInventory/$($env:COMPUTERNAME).txt"
$content = ""
foreach ($VM in $VMs) {
$content += "$($VM.Name)`n"
}
WriteGitHubFile -repo $repo -path $path -content $content
}
function WriteToNinjaOne {
param($VMs)
$fieldValue = ($VMs | ForEach-Object { $_.Name }) -join ', '
# Kombiniert die VM-Namen zu einer einzigen Zeichenkette, getrennt durch Kommas.
Ninja-Property-Set VMs $fieldValue
}
<#
# Dies ist eine Funktion, die die VM-Liste als Wert an ein NinjaOne-Eigenschaftsfeld übergibt.
function WriteToNinjaOne {
param($VMs)
$fieldValue = $VMs -join ', ' # Kombiniert die VM-Namen zu einer einzigen Zeichenkette, getrennt durch Kommas.
Ninja-Property-Set VMs $fieldValue
}#>
# Dies ist eine Funktion, die die Ausgabe auf der Konsole anzeigt.
function WriteToConsole {
param($VMs)
foreach ($VM in $VMs) {
Write-Output $VM.Name
}
}
# Hier verbinden wir die Funktionen und übergeben die Informationen.
$VMs = GetVMInventory
# WriteInventoryToNDrive -VMs $VMs
WriteInventoryToGithub -VMs $VMs
WriteToNinjaOne -VMs $VMs
WriteToConsole -VMs $VMs
Gast
# Made for not only for NinjaOne
# Axel Christian Lenz
# https://www.linkedin.com/in/axellenz/
################## ANPASSEN!!!
$pat = ""
$owner = ""
$repo = "NinjaScriptingStore"
$folder = ""
function ReadGitHubFile($repo, $path, $pat) {
$uri = "https://api.github.com/repos/$owner/$repo/contents/$path"
$headers = @{Authorization = "token $pat"}
$base64Content = Invoke-RestMethod -Uri $uri -Headers $headers | Select-Object -ExpandProperty content
return [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($base64Content))
}
function ReadAllFilesInGitHubFolder($repo, $folder, $pat) {
$response = Invoke-RestMethod -Uri "https://api.github.com/repos/$owner/$repo/contents/$folder" -Headers @{Authorization = "token $pat"}
$fileNames = $response | Where-Object { $_.type -eq "file" -and $_.name -like "*.txt" } | ForEach-Object { $_.path }
$fileContents = @()
foreach ($filePath in $fileNames) {
$content = ReadGitHubFile $repo $filePath $pat
$lines = $content -split "`n" | Where-Object { $_ -ne "" }
$fileName = ($filePath -split "/")[-1] -replace ".txt", ""
foreach ($line in $lines) {
$fileContents += "$fileName,$line"
}
}
return $fileContents
}
# Diese Funktion ermittelt den Hostnamen der lokalen Maschine und sucht ihn in den Dateiinhalten.
function SearchVMHost {
param($fileContents)
$localHostName = $env:COMPUTERNAME
foreach ($line in $fileContents) {
if ($line -match $localHostName) {
return $line.Split(",")[0]
}
}
return $null
}
# Diese Funktion schreibt die VM-Host-Information in ein NinjaOne-Eigenschaftsfeld.
function WriteToNinjaOne {
param($vmHost)
Ninja-Property-Set vmHost $vmHost
}
# Hier verwenden wir die Funktionen und geben die Ergebnisse aus.
# $fileContents = ReadAllFiles
# $result = ReadAllFilesInGitHubFolder $repo $folder $pat
# $result
$fileContents = ReadAllFilesInGitHubFolder $repo $folder $pat
#$fileContents = ReadAllFilesFromGithub
$vmHost = SearchVMHost -fileContents $fileContents
WriteToNinjaOne -vmHost $vmHost
if ($vmHost) {
Write-Output "The VM host for this machine is: $vmHost"
} else {
Write-Output "This machine's host could not be found in the VM inventory."
}