Войти

Показать полную графическую версию : MAC адреса, имена Компьютеров в домене.


Solobro
26-07-2013, 16:22
Приветсвую вас, Гуру скриптования!
Возникли серьезные затруднения , когда пришел момент написать сисадминский скрипт.
Собственно есть полтора .vbs фала один из которых записывает в файл МАК и ИМЯ ПК (но делает это только на исполняемой машине (думаю в автозагрузку засунуть)), и второй (половинка:)) который по сути должен был бы переписывать всю инфу из вышеупомянутого и пихать её в новый файл на админском компе (собственно для просмотра информации о всех компах на которых он запустился). Скрипт приложил на всякий, скорее всего косячные(Prog1.vbs тот самый первый скрипт, второй не выкладываю , чтобы не позориться!). Но Даже закончив эти 2 скрипта, будет только полдела.

Сам я не силен в программировании никак. Скрипт по больше части создан из того , что слизал в инете.

Изначально задача звучит так :
1 . При запросе (желательно из инпут бокса) МАК адреса, программа должна вывести имя запрашиваемого компьютера в домене.
2. Если имя не устраивает Админа, должна быть возможность поменять его. (Не админа но ИМЯ ПК:))
3. Все) Вроде просто , но сложно..

Благодарю всех отликнувшихся энтузиастов! :yes:

DmitriiV
27-07-2013, 00:58
По первому пункту вот один из возможных вариантов (не проверялся):
Dim objWMI, objCollection, objItem
Dim objWsNet, objDomain, objComputer, strDomain, strThisComputer
Dim objWShell, objExec, objOutStream
Dim arrComputers(), strMAC, strName, blnPing, strTemp, i

strMAC = Trim(InputBox("MAC-адрес:"))
If Len(strMAC) > 0 Then
Set objWsNet = CreateObject("WScript.Network")
strDomain = objWsNet.UserDomain
strThisComputer = objWsNet.ComputerName
Set objWsNet = Nothing
Set objDomain = GetObject("WinNT://" & strDomain & ",domain")
objDomain.Filter = Array("computer")
i = -1
For Each objComputer In objDomain
i = i + 1
ReDim Preserve arrComputers(i)
arrComputers(i) = objComputer.Name
Next
Set objComputer = Nothing
Set objDomain = Nothing
On Error Resume Next
For i = 0 To UBound(arrComputers)
strTemp = vbNullString: blnPing = False
If StrComp(strThisComputer, arrComputers(i), vbTextCompare) <> 0 Then
Set objExec = objWShell.Exec("ping -n 1 -w 130 " & arrComputers(i))
Set objOutStream = objExec.StdOut
While Not objOutStream.AtEndOfStream
strTemp = strTemp & Trim(objOutStream.ReadLine)
Wend
If InStr(1, strTemp, "TTL", vbTextCompare) > 0 Then
blnPing = True
Else
blnPing = False
End If
Else
blnPing = True
End If
If blnPing Then
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & arrComputers(i) & "\root\cimv2")
If Err.Number = 0 Then
Set objCollection = objWMI.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE MACAddress='" & strMAC & "'")
If objCollection.Count > 0 Then
strName = arrComputers(i)
Exit For
End If
Set objCollection = Nothing
Set objWMI = Nothing
Else
Err.Clear
End If
End If
Next
Set objOutStream = Nothing
Set objExec = Nothing
Set objWShell = Nothing
If Len(strName) > 0 Then
WScript.Echo "Искомое имя: " & strName
Else
WScript.Echo "Выполнить сопоставление не удалось."
End If
End If
WScript.Quit 0
Второй пункт непонятен.

DmitriiV
29-07-2013, 09:16
Проверил. Нашёл пропущенный оператор.
Перед оператором On Error Resume Next
надо добавить оператор Set objWShell = CreateObject("WScript.Shell")

Поскольку сценарий работает достаточно медленно, то лучше запускать его в консольном режиме. Там, по крайней мере, можно реализовать вывод промежуточных результатов.
Dim objWMI, objCollection, objItem
Dim objWsNet, objDomain, objComputer, strDomain, strThisComputer
Dim objWShell, objExec, objOutStream
Dim arrComputers(), strMAC, strName, blnPing, strTemp, i

strMAC = Trim(InputBox("MAC-адрес:"))
If Len(strMAC) > 0 Then
strMAC = Replace(Replace(strMAC, " ", ""), "-", ":")
Set objWsNet = CreateObject("WScript.Network")
strDomain = objWsNet.UserDomain
strThisComputer = objWsNet.ComputerName
Set objWsNet = Nothing
Set objDomain = GetObject("WinNT://" & strDomain & ",domain")
objDomain.Filter = Array("computer")
i = -1
For Each objComputer In objDomain
i = i + 1
ReDim Preserve arrComputers(i)
arrComputers(i) = objComputer.Name
Next
Set objComputer = Nothing
Set objDomain = Nothing
Set objWShell = CreateObject("WScript.Shell")
On Error Resume Next
For i = 0 To UBound(arrComputers)
strTemp = vbNullString: blnPing = False
If StrComp(strThisComputer, arrComputers(i), vbTextCompare) <> 0 Then
Set objExec = objWShell.Exec("ping -n 1 -w 130 " & arrComputers(i))
Set objOutStream = objExec.StdOut
While Not objOutStream.AtEndOfStream
strTemp = strTemp & Trim(objOutStream.ReadLine)
Wend
If InStr(1, strTemp, "TTL", vbTextCompare) > 0 Then
blnPing = True
Else
blnPing = False
End If
Else
blnPing = True
End If
If blnPing Then
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & arrComputers(i) & "\root\cimv2")
If Err.Number = 0 Then
Set objCollection = objWMI.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE MACAddress='" & strMAC & "'")
If objCollection.Count > 0 Then
strName = arrComputers(i)
Exit For
End If
Set objCollection = Nothing
Set objWMI = Nothing
Else
Err.Clear
End If
End If
Next
Set objOutStream = Nothing
Set objExec = Nothing
Set objWShell = Nothing
If Len(strName) > 0 Then
WScript.Echo "Искомое имя: " & strName
Else
WScript.Echo "Выполнить сопоставление не удалось."
End If
End If
WScript.Quit 0




© OSzone.net 2001-2012