Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

MAC auslesen und in mySQL abfragen

Frage Entwicklung Batch & Shell

Mitglied: Major0190

Major0190 (Level 1) - Jetzt verbinden

29.11.2007, aktualisiert 18.10.2012, 6585 Aufrufe, 8 Kommentare

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:
01.
for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^| find "Physi"') do set mac=%%i  
02.
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
Mitglied: Biber
29.11.2007 um 10:55 Uhr
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.
01.
  
02.
@echo off & setlocal 
03.
set "Mac=" 
04.
Set "Stmt=select inventarnummer from inventar " 
05.
for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^| find "Physi"') do call :setmac %%i  
06.
Set "Stmt=%stmt% where ucase(mac_adresse) in ( %mac%);" 
07.
 
08.
for /f %%b in ('mysql.exe -h localhost -u root -D LIZENZ --execute="%stmt%" -s') DO SET pc=%%b 
09.
goto :eof 
10.
~~~~~~~~ 
11.
:setmac Parameter1 ist eine (von 1...n) MAC-Adressen 
12.
If [%mac%]==[] set "Mac='%1' " else set "Mac=%mac%, '%1' " 
13.
goto :eof
[Ungetestete Skizze]

Grüße
Biber
Bitte warten ..
Mitglied: Dani
29.11.2007, aktualisiert 18.10.2012
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
Bitte warten ..
Mitglied: Biber
29.11.2007 um 19:05 Uhr
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
Bitte warten ..
Mitglied: Major0190
29.11.2007 um 21:21 Uhr
Hallo Biber,

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

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
Bitte warten ..
Mitglied: Biber
29.11.2007 um 23:12 Uhr
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:
01.
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:
01.
echo         Physikalische Adresse . . . . . . : 00-11-22-33-44-55-66>physAd.txt 
02.
echo         Physikalische Adresse . . . . . . : 11-22-33-44-55-66-AA>>physAd.txt 
03.
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:
01.
>set "mac=" & for /f "tokens=2 delims=:" %i in (physad.txt) do @if not defined mac (set "mac='%i'") else set mac=!mac!, '%i' 
02.
 
03.
(=22:52:47  D:\temp=) 
04.
>set mac 
05.
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.
01.
:: ----%temp%\MultiMac.bat 
02.
:: Test-Batch für Auswertung von mehreren Mac-Adressen der IPConfig-Ausgabe 
03.
@echo off & setlocal EnableDelayedExpansion 
04.
set "Mac=" 
05.
:: Das Select-Statement wird länger als etwas, was ich in meinem Alter im Auge behalten könnte. 
06.
:: Mehrere Zeilen untereinander kann ich lesen. Also splitte ich es leserlich. 
07.
Set "Stmt=select inventarnummer from inventar " 
08.
:: ...soweit stimmt das Statement immer... 
09.
REM #### "echte" Zeile: ## for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^| find "Physi"') do call :setmac %%i  
10.
REM Zum Testen nehme ich eine Dummy-Datei "physad.txt" siehe oben 
11.
for /f "tokens=2 delims=:" %%i in (physad.txt) do call :setmac %%i  
12.
Set "Stmt=%stmt% where ucase(mac_adresse) in ( %mac%);" 
13.
echo Debuganzeige Mac :[%mac%] 
14.
Echo Debuganzeige Stmt:[%stmt%]  
15.
REM #### "echte" Zeile:## for /f %%b in ('mysql.exe -h localhost -u root -D LIZENZ --execute="%stmt%" -s') DO SET pc=%%b 
16.
goto :eof 
17.
~~~~~~~~ hier ist der Batch zu Ende... unten kommt noch ein Mini-Call-Block 
18.
~~~~~~~~ In :SetMac wird entschieden: 
19.
~~~~~~~~ wenn variable %Mac% leer , dann weise  %mac% den Wert Parameter %1 zu 
20.
~~~~~~~~                                    z.B '00-11-22-33-44-55-66'  (incl. einfacher '-Anfü-Zeichen) 
21.
~~~~~~~~ wenn variable %Mac% nicht leer , dann hänge an %mac% ein Komma plus den Wert Parameter %1 an 
22.
~~~~~~~~                                    z.B '11-22-33-44-55-66-AA'  (incl. einfacher '-Anfü-Zeichen) 
23.
:setmac Parameter1 ist eine (von 1...n) MAC-Adressen 
24.
If "%mac%"=="" (set "Mac='%1'") else set "Mac=%mac%, '%1'" 
25.
goto :eof 
26.
~~~~und "goto :eof" heißt hier: "Return to caller", zur For-Schleife zurück.
Dieser Testbatch sollte zur Anzeige führen:
01.
>%temp%\multimac 
02.
Debuganzeige Mac :['00-11-22-33-44-55-66', '11-22-33-44-55-66-AA', '22-33-44-55-66-AA-BB'] 
03.
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
Bitte warten ..
Mitglied: Major0190
01.12.2007 um 00:06 Uhr
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.

01.
@echo off & setlocal EnableDelayedExpansion 
02.
  
03.
set "Mac=" 
04.
 
05.
:: Es werden alle MAC-Adressen des PC's ermittelt 
06.
for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^| find "Physi"') do call :setmac %%i  
07.
 
08.
 
09.
:: SQL-Query wird erstellt 
10.
Set "Stmt=select inventarnummer,mac_adresse from inventar where ucase(mac_adresse) in (%mac%)" 
11.
 
12.
 
13.
:: Es werden alle ermittelten MAC-Adressen in der Datenbank gesucht  
14.
(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) 
15.
 
16.
:: Werden mehr wie ein Datensatz gefunden, wird zu :error gesprungen 
17.
IF %cnt% GTR 1 goto :error 
18.
 
19.
 
20.
:: Bei nur einem Datensatz wird der interlegte PC-Name angezeigt (und MAC-Adresse) 
21.
echo MAC-Adresse gefunden: %pc1% %macpc1% 
22.
pause 
23.
goto :eof 
24.
 
25.
:error 
26.
echo Fehler: Es wurden mehrere PC ermittelt 
27.
FOR /L %%a IN (1,1,%cnt%) DO echo %%a. !pc%%a! mit MAC-Adresse !macpc%%a! 
28.
pause 
29.
goto :eof 
30.
 
31.
:setmac 
32.
:: Es wird alle MAC-Adressen aneinandergereiht 'MAC1', 'MAC2', 'MAC3' usw. 
33.
:: und es wird dann wieder zum Caller-Aufruf zurückgesprungen 
34.
If "%mac%"=="" (set "Mac='%1'") else set "Mac=%mac%, '%1'" 
35.
goto :eof
Viel Spaß damit wer es noch brauchen kann und nochmals vielen Dank für die Unterstützung.
Major0190
Bitte warten ..
Mitglied: Biber
03.12.2007 um 07:19 Uhr
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.

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

Grüße
Biber
Bitte warten ..
Mitglied: Major0190
03.12.2007 um 09:09 Uhr
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

Also, nochmals vielen Dank
Major0190
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Windows 7
Computer OU auslesen bzw. abfragen (2)

Frage von mexx991 zum Thema Windows 7 ...

Windows Netzwerk
Netzlaufwerk offline verfügbar für Mac

Frage von PharIT zum Thema Windows Netzwerk ...

Batch & Shell
Eventlog Druckjobs mit VBS auslesen (2)

Frage von joni2000de zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...