# Batch: Hostname & Lizenz zuweisen basierend auf mac Adresse



## Breyn (14. September 2017)

Hallo zusammen,


ich habe etwas Programmiererfahrung in C# und Java, tue mich mit der Batch Syntax allerdings recht schwer. 

Folgendes soll erreicht werden:

1. MAC Adresse auslesen und in Variable speichern
2. MAC Adresse vergleichen mit Liste von Macadressen
3. Bei Match: Festgelegten Hostname sowie MS Lizenz zuweisen

Ich habe bereits einige Beispiele aus dem Internet versucht auf meine Bedürfnisse anzupassen, bisher ohne Erfolg. Das ich die Syntax nicht kenne, macht es nicht einfacher. 

Vielleicht hat ja jemand schnell etwas aus den Ärmeln geschüttelt und mag mir ein wenig dazu erklären.

Viele Grüße!
Breyn

EDIT:

@Echo off

for /f "tokens=*" %%a in ('ipconfig /all ^| findstr "Physische"') do set MAC=%%a
echo %MAC%

pause
exit

Gibt mir aus: Physische Adresse . . . . . . . . : 00-50-56-C0-00-08

Ich benötige jedoch nur die Zahlenkombination, ist es möglich, diese zu separieren? (EDIT: tokens=12 regelt)

Ein weiteres Problem: Auf den Zielrechnern gibt es zwischen 2 und 5 Netzwerkadapter - ich benötige nur "ETHERNET". Eigenartigerweise gibt mir der obige Code immer den dritten Netzwerkadapter. Der erste wäre der richtige.


----------



## Biber3 (14. September 2017)

Moin Breyn,

ich würde ehr über das Utility "getmac" gehen als über IPconfig/all.

Teste mal bitte am Cmd-Prompt

```
for /f "tokens=3 delims=," %i in ('getmac /v /fo csv /nh^|findstr /i Ethernet') do @echo %~i
```
-- bzw. schau dir die Ausgabe an von

```
getmac /v /fo csv /nh
```

Grüße
Biber


----------



## Breyn (15. September 2017)

Hallo Biber,

ich habe mittlerweile ein funktionierendes Skript. Ich habe festgestellt, dass alle Zielrechner den gleichen Typ Netzwerkkarte haben und die erste 6 Zahlen/Ziffern immer identisch sind. Deshalb funktioniert findstr nun, siehe unten.

Dennoch ist Deine Variante besser, da diese unabhängig vom Netzwerkkartentyp funktioniert. Die Ausgabe ist korrekt, es werden jedoch mehrere MACs angegeben:

C:\Users\****>for /f "tokens=3 delims=," %i in ('getmac /v /fo csv /nh^|findstr /i Ethernet') do @Echo %~i
C8-CB-B8-B2-97-21
00-50-56-C0-00-01
00-50-56-C0-00-08
Nicht zutreffend

Das Skript:

@Echo off

set Mac1=D8-50-E6-**-**-**
set Mac2=D8-50-E6-**-**-**
set Mac3=D8-50-E6-**-**-**
set Mac4=D8-50-E6-**-**-**
set Mac5=D8-50-E6-**-**-**
set Mac6=D8-50-E6-**-**-**
set Mac7=D8-50-E6-**-**-**
set Mac8=D8-50-E6-**-**-**

set HostName=
set ProductKey=

for /f "tokens=12" %%a in ('ipconfig /all ^| findstr "D8-50-E6"') do set MyMac=%%a
echo %MyMac%

pause

if %MyMac% EQU %Mac1% (set HostName=SCHULUNG01 & set ProductKey=W269N-WFGWX-YVC9B-4J6C9-T83GX & goto Registry1)
if %MyMac% EQU %Mac2% (set HostName=SCHULUNG02 & set ProductKey=W269N-WFGWX-YVC9B-4J6C9-T83GX & goto Registry1)
if %MyMac% EQU %Mac3% (set HostName=SCHULUNG03 & set ProductKey=W269N-WFGWX-YVC9B-4J6C9-T83GX & goto Registry1)
if %MyMac% EQU %Mac4% (set HostName=SCHULUNG04 & set ProductKey=W269N-WFGWX-YVC9B-4J6C9-T83GX & goto Registry1)
if %MyMac% EQU %Mac5% (set HostName=SCHULUNG05 & set ProductKey=W269N-WFGWX-YVC9B-4J6C9-T83GX & goto Registry1)
if %MyMac% EQU %Mac6% (set HostName=SCHULUNG06 & set ProductKey=W269N-WFGWX-YVC9B-4J6C9-T83GX & goto Registry1)
if %MyMac% EQU %Mac7% (set HostName=SCHULUNG07 & set ProductKey=W269N-WFGWX-YVC9B-4J6C9-T83GX & goto Registry1)
if %MyMac% EQU %Mac8% (set HostName=SCHULUNG08 & set ProductKey=W269N-WFGWX-YVC9B-4J6C9-T83GX & goto Registry1)

pause

:Registry1
Reg add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "NV Hostname" /t REG_SZ /d %HostName% /f
pause
goto Registry2

:Registry2
Reg add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v Hostname /t REG_SZ /d %HostName% /f
pause
goto Registry3

:Registry3
Reg add "HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName" /v ComputerName /t REG_SZ /d %HostName% /f
pause
goto Registry4

:Registry4
Reg add "HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName" /v ComputerName /t REG_SZ /d %HostName% /f
pause
goto License

:License
SLMGR -IPK %ProductKey%
SLMGR -ATO

exit


----------



## Bratkartoffel (15. September 2017)

Hi Brryn,

ich würde die Produktkeys per Edit aus deinem Beitrag entfernen bevor diese gesperrt / öffentlich verwendet werden.

Grüsse,
BK


----------



## Biber3 (15. September 2017)

Moin Breyn,

gerne würde ich an der einen oder anderen Stelle jetzt schreiben können "In Zeilennummer 15 und 26 deines Skripts würde ich es anders schreiben..", aber leider hast du das Skript nicht in Code-Tags ([ code ][/ code ] ohne Leerzeichen) gepackt . ;-)

Ein paar Anmerkungen.
a) zu getmac und den 3 Ethernetten: meine Einschränkung beim Getmac-Filtern war aus nur "Finde mir den String Ethernet".
Wenn da 3 MAC-Adressen rauspurzeln, dann ist dieses Suchkriterium offensichtlich nicht trennscharf genug.
Bitte mach doch, wie oben geschriben, einen Trockentest mit "getmac /v /fo csv /nh" am CMD-Prompt und schaue nach, wie du den "richtigen" Adapter identifizeren kannst.

b) Schönwetterprogrammierung:
Dein Skript fängt keinerlei Fehler an, d.h. klappt prima, wenn dein Plan "Finde mir diesen und jenen String in der und der Ausgabe und mach dann.." aufgeht.
Aber es soll ja nicht nur sinnvoll laufen, wenn EIN Treffer gefunden wird, sondern auch, wenn KEIN oder aber DREI Treffer gefunden werden.
Beispiel: Nach der Suche mit findstr "D8-50-E6" könntest du prüfen, ob sie Variable %Mac% gesetzt ist. Wenn nicht-> goto :nixgefunden

Zustand heute: auch wenn nichts gefunden wird, werden :registry1...:registryN abgefackelt.

c) handwerklich:
Auf jeden Fall bei bei IF-Vergleichen 
Nicht so: if %MyMac% EQU %Mac1%....
Sondern: if "%MyMac%" EQU "%Mac1%"..

Sonst bekommst du einen Syntaxfehler, wenn eine der %variablen% nicht gesetzt ist oder Leerzeichen enthält.

Grüße
Biber


----------



## Breyn (15. September 2017)

@Bratkartoffel: Das ist der offizielle Windows 10 Deployment Key. Der darf gern genutzt werden.  Aber danke für den Hinweis. 

@Biber, Sorry, hatte nicht die Zeit mir anzusehen, wie das geht. Editieren geht nicht mehr, aber für die Zukunft weiß ich Bescheid. Sobald wieder Zeit da ist, melde ich mich nochmal. 

Kurz schonmal dazu, dass die Registry Abschnitte auch dann ausgeführt werden, wenn nichts gefunden wurde - wieso das? Ich denke, dadurch, dass ich goto Registry1 in die if Anweisung gesetzt habe, würde diese meines Verständnisses nach nicht zur Auführung kommen, wenn die Bedingung nicht erfüllt ist.


----------



## Biber3 (15. September 2017)

Moin Breyn,



Breyn hat gesagt.:


> Ich denke, dadurch, dass ich goto Registry1 in die if Anweisung gesetzt habe, würde diese meines Verständnisses nach nicht zur Auführung kommen



ja nee... schau noch mal nach.
Ja, er geht dank "goto :Registry1" zu dieser Sprungmarke, wenn er was gefunden hat.
Und wenn nicht? Dann ist die nächste Zeile nach den ganzen "IF "%MyMac%" EQU.. -Prüfungen...? Na?
Richtig, die Sprungmarke ":Registry1".
Macht er also auch, wenn KEINE IF-Prüfung erforgreich war.

Grüße
Biber


----------



## Breyn (15. September 2017)

Ach, alles klar. Sprich eine Sprungmarke wird nicht nur durch goto angesprochen, sondern auch dann, wenn die Sprungmarke als nachfolgender Programmabschnitt auftaucht. Ich ging davon aus, ohne goto würde diese Sprungmarke übersprungen. Gut zu wissen.

Bis hierhin schonmal vielen Dank für Deinen Input.


----------

