MAC auslesen und in mySQL abfragen
Hallo zusammen,
stehe hier ein wenig auf dem Schlauch.
für eine Unattended_Installation möchte ich die MAC-Adresse (ipconfig/all) auslesen und dann eine Anfrage bei einer mySQL-Datenbank starten um den Computernamen zu ermitteln. Funktioniert bei einer MAC-Adresse auch sehr gut.
Was mache ich aber wenn es mehrere LAN-Verbindungen gibt (VMware, Lan-Verbindung, WLAN usw.)?
Ich möchte jetzt alle MAC-Adressen nacheinander auslesen, bei der DB abfragen bis eine positives Ergebnis gefunden wird und dieses Ergebnis dann in die Variable %Compname% schreiben und die Schleife beenden.
Was ich bis jetzt habe ist folgendes:
Bekomme ich das in einer Batch hin oder muß ich das Ergebnis der MAC-Ermittlung erst in eine Datei schreiben und die in einem zweiten Schritt dann mit der SQL-Abfrage abfragen.
Vielen Dank für die Unterstützung
Major0190
stehe hier ein wenig auf dem Schlauch.
für eine Unattended_Installation möchte ich die MAC-Adresse (ipconfig/all) auslesen und dann eine Anfrage bei einer mySQL-Datenbank starten um den Computernamen zu ermitteln. Funktioniert bei einer MAC-Adresse auch sehr gut.
Was mache ich aber wenn es mehrere LAN-Verbindungen gibt (VMware, Lan-Verbindung, WLAN usw.)?
Ich möchte jetzt alle MAC-Adressen nacheinander auslesen, bei der DB abfragen bis eine positives Ergebnis gefunden wird und dieses Ergebnis dann in die Variable %Compname% schreiben und die Schleife beenden.
Was ich bis jetzt habe ist folgendes:
for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^| find "Physi"') do set mac=%%i
for /f %%b in ('mysql.exe -h localhost -u root -D LIZENZ --execute="select inventarnummer from inventar where mac_adresse=trim(leading ' ' from lcase('%mac%'));" -s') DO SET pc=%%b
Bekomme ich das in einer Batch hin oder muß ich das Ergebnis der MAC-Ermittlung erst in eine Datei schreiben und die in einem zweiten Schritt dann mit der SQL-Abfrage abfragen.
Vielen Dank für die Unterstützung
Major0190
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 74757
Url: https://administrator.de/forum/mac-auslesen-und-in-mysql-abfragen-74757.html
Ausgedruckt am: 29.04.2025 um 07:04 Uhr
8 Kommentare
Neuester Kommentar
Moin Major0190,
mit Batch kenn ich mich leider nicht so aus, aber die Abfragelogik würde ich umdrehen, so dass Du erst alle auf dem Rechner vorhandenen MAC-Adressen ermittelst und daraus dann eine Abfrage WHERE ...IN (mac-Adressenlist) bastelst.
[Ungetestete Skizze]
Grüße
Biber
mit Batch kenn ich mich leider nicht so aus, aber die Abfragelogik würde ich umdrehen, so dass Du erst alle auf dem Rechner vorhandenen MAC-Adressen ermittelst und daraus dann eine Abfrage WHERE ...IN (mac-Adressenlist) bastelst.
@echo off & setlocal
set "Mac="
Set "Stmt=select inventarnummer from inventar "
for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^| find "Physi"') do call :setmac %%i
Set "Stmt=%stmt% where ucase(mac_adresse) in ( %mac%);"
for /f %%b in ('mysql.exe -h localhost -u root -D LIZENZ --execute="%stmt%" -s') DO SET pc=%%b
goto :eof
~~~~~~~~
:setmac Parameter1 ist eine (von 1...n) MAC-Adressen
If [%mac%]== set "Mac='%1' " else set "Mac=%mac%, '%1' "
goto :eof
Grüße
Biber
Hi Biber,
Könntest du deinen Kommentar noch zusätzlich in mein Tutorial posten?! Somit hätten wir dann den Fall für die Zukunft auch gleich untergebracht.
Grüße
Dani
mit Batch kenn ich mich leider nicht so aus,
Jetz kann ich wieder lachen. <grins>Könntest du deinen Kommentar noch zusätzlich in mein Tutorial posten?! Somit hätten wir dann den Fall für die Zukunft auch gleich untergebracht.
Grüße
Dani
Moin Dani,
Ich habe vorhin nur kurz stehend freihändig etwas hingemalt.
Sobald es stabil ist laut Major0190 übertrage ich es in Dein Tutorial.
Grüße
Biber
Könntest du deinen Kommentar noch zusätzlich in mein Tutorial posten?!
Klar, sobald wir hier in diesem Beitrag eine Bestätigung bekommen, dass der Ansatz klappen könnte.Ich habe vorhin nur kurz stehend freihändig etwas hingemalt.
Sobald es stabil ist laut Major0190 übertrage ich es in Dein Tutorial.
Grüße
Biber
Moin Major0190,
ich versuch mal zu erklären, was meine Strategie war.
Angenommen, ich bekäme bei der IPConfig-Auswertung drei (relevante) Zeilen mit MAC-Adressen zurück, dann sähe jede Zeile prinzipiell so aus:
Zum Testen (und ggf nachkaspern) lege ich mal eine 3-Mac-Ausgabe als Datei vom CMD-Prompt aus an.
Macht beim Testen ja keinen Unterschied. Drei Zeilen vom CMD-Prompt abfeuern:
Damit taste ich mich mit einem Oneliner vom CMD-Prompt aus ran an den Proof-of-Concept:
Und damit kann ich jetzt die Batch-Skizze von oben korrigieren und vervollständigen.
Dieser Testbatch sollte zur Anzeige führen:
Hoffe, das war verständlich? Sonst müssen wir bastla holen...

Grüße
Biber
ich versuch mal zu erklären, was meine Strategie war.
Angenommen, ich bekäme bei der IPConfig-Auswertung drei (relevante) Zeilen mit MAC-Adressen zurück, dann sähe jede Zeile prinzipiell so aus:
Physikalische Adresse . . . . . . : 00-11-22-33-44-55-66
Macht beim Testen ja keinen Unterschied. Drei Zeilen vom CMD-Prompt abfeuern:
echo Physikalische Adresse . . . . . . : 00-11-22-33-44-55-66>physAd.txt
echo Physikalische Adresse . . . . . . : 11-22-33-44-55-66-AA>>physAd.txt
echo Physikalische Adresse . . . . . . : 22-33-44-55-66-AA-BB>>physAd.txt
Damit taste ich mich mit einem Oneliner vom CMD-Prompt aus ran an den Proof-of-Concept:
>set "mac=" & for /f "tokens=2 delims=:" %i in (physad.txt) do @if not defined mac (set "mac='%i'") else set mac=!mac!, '%i'
(=22:52:47 D:\temp=)
>set mac
mac=' 00-11-22-33-44-55-66', ' 11-22-33-44-55-66-AA', ' 22-33-44-55-66-AA-BB'
Und damit kann ich jetzt die Batch-Skizze von oben korrigieren und vervollständigen.
:: ----%temp%\MultiMac.bat
:: Test-Batch für Auswertung von mehreren Mac-Adressen der IPConfig-Ausgabe
@echo off & setlocal EnableDelayedExpansion
set "Mac="
:: Das Select-Statement wird länger als etwas, was ich in meinem Alter im Auge behalten könnte.
:: Mehrere Zeilen untereinander kann ich lesen. Also splitte ich es leserlich.
Set "Stmt=select inventarnummer from inventar "
:: ...soweit stimmt das Statement immer...
REM #### "echte" Zeile: ## for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^| find "Physi"') do call :setmac %%i
REM Zum Testen nehme ich eine Dummy-Datei "physad.txt" siehe oben
for /f "tokens=2 delims=:" %%i in (physad.txt) do call :setmac %%i
Set "Stmt=%stmt% where ucase(mac_adresse) in ( %mac%);"
echo Debuganzeige Mac :[%mac%]
Echo Debuganzeige Stmt:[%stmt%]
REM #### "echte" Zeile:## for /f %%b in ('mysql.exe -h localhost -u root -D LIZENZ --execute="%stmt%" -s') DO SET pc=%%b
goto :eof
~~~~~~~~ hier ist der Batch zu Ende... unten kommt noch ein Mini-Call-Block
~~~~~~~~ In :SetMac wird entschieden:
~~~~~~~~ wenn variable %Mac% leer , dann weise %mac% den Wert Parameter %1 zu
~~~~~~~~ z.B '00-11-22-33-44-55-66' (incl. einfacher '-Anfü-Zeichen)
~~~~~~~~ wenn variable %Mac% nicht leer , dann hänge an %mac% ein Komma plus den Wert Parameter %1 an
~~~~~~~~ z.B '11-22-33-44-55-66-AA' (incl. einfacher '-Anfü-Zeichen)
:setmac Parameter1 ist eine (von 1...n) MAC-Adressen
If "%mac%"=="" (set "Mac='%1'") else set "Mac=%mac%, '%1'"
goto :eof
~~~~und "goto :eof" heißt hier: "Return to caller", zur For-Schleife zurück.
Dieser Testbatch sollte zur Anzeige führen:
>%temp%\multimac
Debuganzeige Mac :['00-11-22-33-44-55-66', '11-22-33-44-55-66-AA', '22-33-44-55-66-AA-BB']
Debuganzeige Stmt:[select inventarnummer from inventar where ucase(mac_adresse) in ( '00-11-22-33-44-55-66', '11-22-33-44-55-66-AA', '22-33-44-55-66-AA-BB');]
Hoffe, das war verständlich? Sonst müssen wir bastla holen...
Fragen über Fragen - aber lieber einmal doof gefragt als doof bleiben.
Die Fragen hab ich alle beantwortet, denke ich... die Reihenfolge war nur anders. Grüße
Biber
Moin Major0190,
danke für das Posten Deiner nochmal erweiterten Lösung.
Ich habe diese nur teilweise als Ergänzung in übernommen (ohne das Handling von mehrfach vorkommenden MAC-Adressen in der mySQL-Tabelle).
Denn IMHO ist es unumgänglich, wenn wir doch nun inzwischen "wissen", dass auch mehrere MAC-Adressen je Inventarnummer vorkommen können, aber die MAC-Adresse nach wie vor einmalig sein muss, dass die MAC-Adresse der PK in der Tabelle werden muss.
So würde ich es machen, um den von Dir behandelten Konfliktfall schon DB-seitig auszuschließen.
Denn es macht für mich auch keinen Sinn, wenn mir bei der versuchten Installation eines Client-PCs der Fehler angezeigt wird "Hey, Du hast Widersprüche in Deiner Inventar-Datenbank."
Das wäre mir eher peinlich.
Anyhow, das war aber ja nicht das Wesentliche dieses Threads - von daher kann das auch außerhalb des Tutorials diskutiert werden.
Grüße
Biber
danke für das Posten Deiner nochmal erweiterten Lösung.
Ich habe diese nur teilweise als Ergänzung in übernommen (ohne das Handling von mehrfach vorkommenden MAC-Adressen in der mySQL-Tabelle).
Denn IMHO ist es unumgänglich, wenn wir doch nun inzwischen "wissen", dass auch mehrere MAC-Adressen je Inventarnummer vorkommen können, aber die MAC-Adresse nach wie vor einmalig sein muss, dass die MAC-Adresse der PK in der Tabelle werden muss.
So würde ich es machen, um den von Dir behandelten Konfliktfall schon DB-seitig auszuschließen.
Denn es macht für mich auch keinen Sinn, wenn mir bei der versuchten Installation eines Client-PCs der Fehler angezeigt wird "Hey, Du hast Widersprüche in Deiner Inventar-Datenbank."
Das wäre mir eher peinlich.
Anyhow, das war aber ja nicht das Wesentliche dieses Threads - von daher kann das auch außerhalb des Tutorials diskutiert werden.
Grüße
Biber