major0190
Goto Top

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:
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

Content-Key: 74757

Url: https://administrator.de/contentid/74757

Ausgedruckt am: 28.03.2024 um 17:03 Uhr

Mitglied: Biber
Biber 29.11.2007 um 10:55:40 Uhr
Goto Top
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.
 
@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
[Ungetestete Skizze]

Grüße
Biber
Mitglied: Dani
Dani 29.11.2007, aktualisiert am 18.10.2012 um 18:32:44 Uhr
Goto Top
Hi Biber,
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
Mitglied: Biber
Biber 29.11.2007 um 19:05:40 Uhr
Goto Top
Moin Dani,

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
Mitglied: Major0190
Major0190 29.11.2007 um 21:21:05 Uhr
Goto Top
Hallo Biber,

Du kannst nicht Batch-Programmieren - kein Problem - ier im Forum wird Dir sicherlich geholfen face-wink

Erst mal vielen Dank für Deine schnelle Antwort und Deine Beiträge hier im Forum - konnte schon sehr viel von Dir lernen.

So, habe Dein Skript mal getestet - ich glaube ich bin zu d**f dazu.
Du ließt in der vierten Zeile mit "for/f" die ERSTE MAC-Adresse aus und springst dann zu :setmac.
Dann fragst Du mit IF ab on in %mac% was drin steht - wenn Nein wird der Variable MAC die ausgelesene Mac-Adresse übergeben und dann wird das skript beendet, oder? Für was ist der ELSE-Teil? Ok, sollte in der %mac% was drinstehen, setzt er in die Variable MAC irgendeine Mac-Adresse (keine ahnung woher er die bekommt, kommt ja nie zur SQL-Abfrage) und setzt dann dazu ein Komma und in Anführungszeichen die ausgelesene Max-Adresse.

Er kommt doch gar nie an die SQL-Abrage, oder?

Warum setzt du den SQL-Query in zwei Anläufen? Set "Stmt=select inventarnummer from inventar " und zwei Zeilen tiefer wird der Rest dazugesetzt - wobei er glaube ich dort gar nie ankommt.

Fragen über Fragen - aber lieber einmal doof gefragt als doof bleiben.

Vielen Dank für Deine Hilfe
Mitglied: Biber
Biber 29.11.2007 um 23:12:19 Uhr
Goto Top
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:
Physikalische Adresse . . . . . . : 00-11-22-33-44-55-66
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:
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. face-wink

Grüße
Biber
Mitglied: Major0190
Major0190 01.12.2007 um 00:06:52 Uhr
Goto Top
Hallo Biber,

na wenn das mal nicht eine Anleitung war - jetzt habe auch ich es kapiert.
Das Skript hat soweit funktioniert - vielen Danke. Ich habe jetzt noch eine Funktion eingebaut, die überprüft ob die MAC-Adresse nur einmal in der SQL-DB vorkommt. Wir hatten z.B. den Fall, dass ein Rechner in die DB eingetragen wurde. Der Rechner wurde verschrottet, der Eintrag aber nie gelöscht. Bei einem anderen Rechner ging die Netzwerkekarte kapputt und es wurde genau diese Karte aus dem defekten Rechner eingebaut - die MAC-Adresse wurde für diese Karte nochmal in der DB angepaßt und es war zweimal die gleiche MAC-Adresse vorhanden.

Es darf als nur ein Datensatz zurück gemeldet werden damit die Installation weiterläuft.

@echo off & setlocal EnableDelayedExpansion
 
set "Mac="  

:: Es werden alle MAC-Adressen des PC's ermittelt 
for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^| find "Physi"') do call :setmac %%i   


:: SQL-Query wird erstellt
Set "Stmt=select inventarnummer,mac_adresse from inventar where ucase(mac_adresse) in (%mac%)"  


:: Es werden alle ermittelten MAC-Adressen in der Datenbank gesucht 
(set /a cnt=0) & for /f "tokens=1-2" %%b in ('mysql.exe -h localhost -u root -D LIZENZ --execute="%stmt%" -s') DO (set /a cnt+=1) & (SET pc!cnt!=%%b) & (SET macpc!cnt!=%%c)  

:: Werden mehr wie ein Datensatz gefunden, wird zu :error gesprungen
IF %cnt% GTR 1 goto :error


:: Bei nur einem Datensatz wird der interlegte PC-Name angezeigt (und MAC-Adresse)
echo MAC-Adresse gefunden: %pc1% %macpc1%
pause
goto :eof

:error
echo Fehler: Es wurden mehrere PC ermittelt
FOR /L %%a IN (1,1,%cnt%) DO echo %%a. !pc%%a! mit MAC-Adresse !macpc%%a!
pause
goto :eof

:setmac
:: Es wird alle MAC-Adressen aneinandergereiht 'MAC1', 'MAC2', 'MAC3' usw. 
:: und es wird dann wieder zum Caller-Aufruf zurückgesprungen
If "%mac%"=="" (set "Mac='%1'") else set "Mac=%mac%, '%1'"  
goto :eof

Viel Spaß damit wer es noch brauchen kann und nochmals vielen Dank für die Unterstützung.
Major0190
Mitglied: Biber
Biber 03.12.2007 um 07:19:01 Uhr
Goto Top
Moin Major0190,

danke für das Posten Deiner nochmal erweiterten Lösung.

Ich habe diese nur teilweise als Ergänzung in Danis Tutorial ü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. face-wink

Anyhow, das war aber ja nicht das Wesentliche dieses Threads - von daher kann das auch außerhalb des Tutorials diskutiert werden.

Grüße
Biber
Mitglied: Major0190
Major0190 03.12.2007 um 09:09:35 Uhr
Goto Top
Guten Morgen Biber,

ob ich es mit der doppelten MAC-Adressen-Abfrage wirklich so im produktiv Betrieb umsetze weiß ich noch nicht - aber es war für mich zumindest eine nette Übung face-wink

Also, nochmals vielen Dank
Major0190