retrodude
Goto Top

Ausgelesene MAC in SMBIOS GUID Feld im AD eintragen

Hallo zusammen. Ich brauche ein Tool mit dem ich anhand eines eigegebenen PC Namens (per GUI), dessen MAC auslesen und anschliessend diese mit 20 Nullen addiert im AD auf dessen Computerobjekt im Feld SMBIOS GUID eintragen kann. Wir wollen nicht mehr die richtige GUID nehmen, weil die beim Aufsetzen der Clients via PXE WDS subnetzübergreifend irgendwie Probleme verursacht . Die Methode mit der MAC und den 20 Nullen funktioniert aber immer. Cool wäre natürlich, wenn man diesem GUI mehrere Hostnahmen angeben könnte.
Ich hab da bereits was gefunden um die MAC auszulesen. Die Addition der Nullen ist auch kein Problem. Das Problem ist aber, dass die MAC mit : als Trennzeichen ausgelesen wird... so kann ich den Wert nicht übergeben.. Dies ist bereits mein erstes Problem..


' -------------------------------------------------------------------------------------
Set fso = createobject ("scripting.filesystemobject")
Set ntwrk = createobject ("wscript.network")
strComputer = ntwrk.computername

Set objWMIService = GetObject _
("winmgmts:{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")

Set colAdapters = objWMIService.ExecQuery _
("Select * From Win32_NetworkAdapterConfiguration " _
& "Where IPEnabled = True")

For Each objAdapter in colAdapters
Client_MAC = objAdapter.MACAddress
Client_SMBIOS = Client_MAC&"00000000000000000000"
WScript.Echo Client_SMBIOS
Next
' ------------------------------------------------------------------------------------

Besten Dank im Voraus!
Gruss

Content-Key: 147979

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

Printed on: April 19, 2024 at 21:04 o'clock

Mitglied: 60730
60730 Jul 30, 2010 at 07:28:45 (UTC)
Goto Top
Moin,

ne ganz doofe gegenfrage meinerseits..

Dein VBS läuft unter Windows und du willst die Daten, die das erzeugt dazu benutzen, das Windows erst via PXE WDS auf die Kisten zu bekommen?

Na klar - mit dem Bart oder ner anderen Version von PE ginge das, aber obs schpeedmäßig auch Sinn macht?

Und dann
For Each objAdapter in colAdapters
hmm - wenn die Ksuet aber nun Blauzahn usw. hat - greift das Vbs aber nicht wirklich.......

Gruß
Member: RetroDude
RetroDude Jul 30, 2010 at 07:45:06 (UTC)
Goto Top
Hallo. Nein, ich will diese Korrektur im AD vor dem Setup mit WDS vornehmen. Das wären PCs die bereits installiert sind und per WDS neu aufgestetzt werden müssen. Durch vor Ort Supporter z.B.. Es sollte auch möglich sein die MAC von Hand anzugeben in diesem GUI. Somit wären auch Kisten abgedeckt, welche nicht abgefragt werden können. Es handelt sich um Phatclients mit 1 NIC. Kein Blauzahn und so.. face-wink

Ich habe da noch mehr Code zusammen getragen:


'Auslesen der MAC Adresse:


'------------------------------------
set fso = createobject ("scripting.filesystemobject")
Set ntwrk = createobject ("wscript.network")
strComputer = ntwrk.computername

Set objWMIService = GetObject _
("winmgmts:{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")

Set colAdapters = objWMIService.ExecQuery _
("Select * From Win32_NetworkAdapterConfiguration " _
& "Where IPEnabled = True")

For Each objAdapter in colAdapters
Client_MAC = objAdapter.MACAddress
Client_SMBIOS = Client_MAC&"00000000000000000000"
Next

'--------------------------------------------
Ich versuche nun meine (Noch mit Doppelpunkten versehene..) Variable dem zweiten Codeblock zu übergeben. So sollte ich den Wechsel der GUID vornehmen können. Wie kann ich die Doppelpunkte aus der gelieferten MAC Adresse filtern?
Member: RetroDude
RetroDude Aug 05, 2010 at 13:09:27 (UTC)
Goto Top
So, die Guid hab ich formatiert. ich schaffs aber noch nicht sie auf dem AD Objekt einzutragen. Hat da jemand ne Idee? Wäre froh um Input..


Set fso = createobject ("scripting.filesystemobject")
' Set ntwrk = createobject ("wscript.network")
' strComputer = ntwrk.computername

' Prombt für Computernamen

strComputer = InputBox("Computernamen eingeben","SMBIOS_GUID in AD setzen")

' Auslesen der MAC-Adresse

Set objWMIService = GetObject _
("winmgmts:{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")

Set colAdapters = objWMIService.ExecQuery _
("Select * From Win32_NetworkAdapterConfiguration " _
& "Where IPEnabled = True")

For Each objAdapter in colAdapters
Client_MAC = objAdapter.MACAddress
Next

' Herausfiltern der :

Dim MyString, MyArray, i
MyString = Client_MAC
MyArray = Split(MyString, ":", -1, 1)

For i = 0 to UBound(MyArray)
' MsgBox (MyArray(i))
Next

MAC_Neu = MyArray(0)&MyArray(1)&MyArray(2)&MyArray(3)&MyArray(4)&MyArray(5)&"00000000000000000000"

' MsgBox (MAC_Neu)


' Setzen der SMBIOS GUID im AD

DN_Client = "cn="&strComputer&",ou=Client,dc=domain,dc=domain,dc=domain"
' MsgBox (DN_Client)

UpdateNetbootGuid MAC_Neu,DN_Client


Set oComputer = DN_Client
oComputer.Put "netbootGuid"
oComputer.SetInfo

Set oComputer = Nothing
End Sub
Member: RetroDude
RetroDude Aug 11, 2010 at 13:19:07 (UTC)
Goto Top
So, hab mir ne Lösung gebastelt. Auch ohne Euch! face-wink

Ich hab das Ganze noch mit Inputbox, WMI etc. etwas angepasst: (VMWare wird erkannt und nicht berücksichtigt. Einfach erweiterbar)


Option Explicit
Dim strComputerName
strComputerName = InputBox("Computernamen eingeben","SMBIOS_GUID in AD setzen")
If strComputerName = "" Then
WScript.quit
Else
Call UpdateNetbootGuid(guidGetUUID, szGetDn)
End If

Function guidGetUUID
Dim NetworkAdapterSet, NetworkAdapter, objWMI
Set objWMI = GetObject("winmgmts:\\"& strComputerName &"\root\CIMV2")
Set NetworkAdapterSet = objWMI.InstancesOf("Win32_NetworkAdapter")
For Each NetworkAdapter In NetworkAdapterSet
If NetworkAdapter.AdapterType = "Ethernet 802.3" And Not (NetworkAdapter.Description = "Packet Scheduler Miniport" _
Or NetworkAdapter.Description = "VMware Virtual Ethernet Adapter for VMnet1" _
Or NetworkAdapter.Description = "VMware Virtual Ethernet Adapter for VMnet8") Then
guidGetUUID = "00000000-0000-0000-0000-" & Replace(NetworkAdapter.MACAddress, ":", "")
End If
Next
End Function

Function szGetDN

Dim objTrans, objDomain, wshNetwork ', strComputerName

Const ADS_NAME_INITTYPE_GC = 3
Const ADS_NAME_TYPE_NT4 = 3
Const ADS_NAME_TYPE_1779 = 1

Set wshNetwork = CreateObject("WScript.Network")
Set objTrans = CreateObject("NameTranslate")
Set objDomain = getObject("LDAP:rootDse")
objTrans.Init ADS_NAME_INITTYPE_GC, ""
objTrans.Set ADS_NAME_TYPE_NT4, wshNetwork.UserDomain & "\" _
& strComputerName & "$"
szGetDN = objTrans.Get(ADS_NAME_TYPE_1779)
szGetDN = UCase(szGetDN)
End Function

Sub UpdateNetbootGuid(guidUUID, szComputerDn)
Dim oComputer

Set oComputer = GetObject("LDAP:
" & szComputerDn)
If ByteArrayToGuid(oComputer.netbootGuid) <> guidUUID Then
oComputer.Put "netbootGuid", baConvertGuidToByteArray(guidUUID)
oComputer.SetInfo
End If
MsgBox(guidUUID)
Set oComputer = Nothing
Set guidUUID = Nothing
End Sub

Function ByteArrayToGuid(arrbytOctet)
If Not IsEmpty(arrbytOctet) Then
ByteArrayToGuid = _
Right("0" & Hex(AscB(MidB(arrbytOctet, 4, 1))), 2) & _
Right("0" & Hex(AscB(MidB(arrbytOctet, 3, 1))), 2) & _
Right("0" & Hex(AscB(MidB(arrbytOctet, 2, 1))), 2) & _
Right("0" & Hex(AscB(MidB(arrbytOctet, 1, 1))), 2) & _
"-" & _
Right("0" & Hex(AscB(MidB(arrbytOctet, 6, 1))), 2) & _
Right("0" & Hex(AscB(MidB(arrbytOctet, 5, 1))), 2) & _
"-" & _
Right("0" & Hex(AscB(MidB(arrbytOctet, 8, 1))), 2) & _
Right("0" & Hex(AscB(MidB(arrbytOctet, 7, 1))), 2) & _
"-" & _
Right("0" & Hex(AscB(MidB(arrbytOctet, 9, 1))), 2) & _
Right("0" & Hex(AscB(MidB(arrbytOctet, 10, 1))), 2) & _
"-" & _
Right("0" & Hex(AscB(MidB(arrbytOctet, 11, 1))), 2) & _
Right("0" & Hex(AscB(MidB(arrbytOctet, 12, 1))), 2) & _
Right("0" & Hex(AscB(MidB(arrbytOctet, 13, 1))), 2) & _
Right("0" & Hex(AscB(MidB(arrbytOctet, 14, 1))), 2) & _
Right("0" & Hex(AscB(MidB(arrbytOctet, 15, 1))), 2) & _
Right("0" & Hex(AscB(MidB(arrbytOctet, 16, 1))), 2)
End If
End Function

Function baConvertGuidToByteArray(ByVal strHexString)
Dim fso, stream, temp, ts, n, szScrubbedString
Set fso = CreateObject ("scripting.filesystemobject")
Set stream = CreateObject ("adodb.stream")
Const TemporaryFolder = 2

temp = fso.GetSpecialFolder(TemporaryFolder) & fso.gettempname ()

Set ts = fso.createtextfile (temp)

szScrubbedString = Replace(strHexString, "-", "")

ts.write Chr("&h" & Mid(szScrubbedString, 7, 2))
ts.write Chr("&h" & Mid(szScrubbedString, 5, 2))
ts.write Chr("&h" & Mid(szScrubbedString, 3, 2))
ts.write Chr("&h" & Mid(szScrubbedString, 1, 2))
ts.write Chr("&h" & Mid(szScrubbedString, 11, 2))
ts.write Chr("&h" & Mid(szScrubbedString, 9, 2))
ts.write Chr("&h" & Mid(szScrubbedString, 15, 2))
ts.write Chr("&h" & Mid(szScrubbedString, 13, 2))
ts.write Chr("&h" & Mid(szScrubbedString, 17, 2))
ts.write Chr("&h" & Mid(szScrubbedString, 19, 2))
ts.write Chr("&h" & Mid(szScrubbedString, 21, 2))
ts.write Chr("&h" & Mid(szScrubbedString, 23, 2))
ts.write Chr("&h" & Mid(szScrubbedString, 25, 2))
ts.write Chr("&h" & Mid(szScrubbedString, 27, 2))
ts.write Chr("&h" & Mid(szScrubbedString, 29, 2))
ts.write Chr("&h" & Mid(szScrubbedString, 31, 2))

ts.close

stream.type = 1
stream.open
stream.loadfromfile temp

baConvertGuidToByteArray = stream.read

stream.close
fso.deletefile temp

Set stream = Nothing
Set fso = Nothing
End Function


Gruss
Retrodude
Member: RetroDude
RetroDude Aug 12, 2010 at 07:22:00 (UTC)
Goto Top
Ich habe in folgendem Coedblock ein Problem mit der Fehlerabfrage. Falls auf einem PC WMI nicht richtig funktioniert sollte das Script erneut eine Eingabemaske bringen. So kann man die MAC Adresse manuell eingeben. Wenn dieZuweisung " Set objWMI = GetObject("winmgmts:\\"& strComputerName &"\root\CIMV2")" scheitert ist kein Zugriff auf WMI möglich. Dies möchte ich abfangen. Ich habe zu Beginn des Scripts ein on error resume next reingepflastert und gehofft, dass ich mit der IsObject Prüfung dies abfangen könnte. Das funktioniert leider nicht. Habe keinen Ansatz wie ich dies abfangen könnte. Kann mir da jemand weiterhelfen? ...


Function guidGetUUID
Dim NetworkAdapterSet, NetworkAdapter, objWMI, Man_MAC
Set objWMI = GetObject("winmgmts:\\"& strComputerName &"\root\CIMV2")
If IsObject(objWMI) Then
Set NetworkAdapterSet = objWMI.InstancesOf("Win32_NetworkAdapter")
For Each NetworkAdapter In NetworkAdapterSet
If NetworkAdapter.AdapterType = "Ethernet 802.3" And Not (NetworkAdapter.Description = "Packet Scheduler Miniport" _
Or NetworkAdapter.Description = "VMware Virtual Ethernet Adapter for VMnet1" _
Or NetworkAdapter.Description = "VMware Virtual Ethernet Adapter for VMnet8") Then
guidGetUUID = "00000000-0000-0000-0000-" & Replace(NetworkAdapter.MACAddress, ":", "")
MsgBox(guidGetUUID)
End If
Next
Else
Man_MAC = InputBox("MAC kann nicht ausgelesen werden!","00:00:00:00:00:00")
guidGetUUID = "00000000-0000-0000-0000-" & Replace(Man_MAC, ":", "")
End If
End Function


Gruss
Member: RetroDude
RetroDude Aug 17, 2010 at 15:20:40 (UTC)
Goto Top
Habs per DB Abfrage bzw. lokales Auslesen per Loginscript und Eintragen in SQL DB gelöst. WMI per Remote ist mir zu mühsam da fehleranfällig. Habe fertig.