1

Тема: VBScript: собираем информацию о компьютерах домена

Скрипт собирает информацию о компьютерах домена: роль в домене, семейство процессора и его частоту, размер оперативной памяти и жестких диков. Скрипт запускает MS Excel и выводит в него информацию. Потребуются права администратора домена. Скрипт может являться примером не только получения информации с помощью WMI, но и примером быстрого и удобного вывода данных в скриптах с помощью MS Excel.

Запускать prosto v EXCEL.wsf, файл info.vbs должен лежать рядом.
Автор примера - Алексей Жучков, г. Ессентуки.

info.vbs

function GetMemSize (name) 'возвращает размер оперативной памяти комьютера name
    on error resume next
    Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&name&"\root\CIMV2")
    If Err.Number = 0 Then
        For Each objOS In objService.ExecQuery("SELECT * FROM Win32_ComputerSystem")
        GetMemSize=objOS.TotalPhysicalMemory/1024/1024
        Next
    end if    
End function

function Avaible (name) 'пингом проверяет доступность компьютера name в сети
    on error resume next
    Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}")._
        ExecQuery("select * from Win32_PingStatus where address = '"_
            & name & "'")
    For Each objStatus in objPing
        If IsNull(objStatus.StatusCode) or objStatus.StatusCode<>0 Then 
            Avaible=false
        else
            Avaible=true
        End If
    Next
End function

function Role (name) ' возвращет роль компьютера name в домене
    on error resume next
    Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&name&"\root\CIMV2")
    If Err.Number = 0 Then
        For Each objOS In objService.ExecQuery("SELECT * FROM Win32_ComputerSystem")
        Select Case objOS.DomainRole
        Case "0" Role="Standalone Workstation"
        Case "1" Role="Рабочее место"
        Case "2" Role="Standalone Server"
        Case "3" Role="Member Server"
        Case "4" Role="Сервер"
        Case "5" Role="Сервер"
        End Select
        Next
    end if    
End function

function ProcessorFamily (name) 'возвращает название процессора компьютера name 
On Error Resume Next
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & name & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor")
For Each objItem in colItems    
    ProcessorFamily=objItem.Name
Next
end function

function ProcessorClock (name) 'возвращает частоту процессора name 
On Error Resume Next
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & name & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor")
For Each objItem in colItems
    ProcessorClock=objItem.CurrentClockSpeed
Next
end function

function GetDisksSize(name) 'возвращает размер НЖМД компьюетра name, если их несолько то все через пробел
size=""
on error resume next
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & name & "\root\cimv2")
Set colDiskDrives = objWMIService.ExecQuery _    
    ("Select * from Win32_DiskDrive")
For each objDiskDrive in colDiskDrives       
    size=size&" "&round(objDiskDrive.Size/1024/1024/1024)
Next
GetDisksSize=size
end function

Function IsWinNT(name) 'NT ли на компьютере name
On Error Resume Next
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&name&"\root\CIMV2")
For Each objOS In objService.ExecQuery("SELECT * FROM Win32_OperatingSystem")
    Exit For
Next
'16 - WIN95, 17 - WIN98, 18 - WINNT, 19 - WINCE
if objOS.OSType=18 then
    IsWinNT=true
else
    IsWinNT=false
end if
End function

prosto v EXCEL.wsf

'Получает инфо о компьютерах домена
'Роль в домене, семейство процессора и его частоту, размер оперативной памяти и жестких диков
<job id="FillIfo">
   <script language="VBScript" src="info.vbs"/>
   <script language="VBScript">
    Set WshShell = WScript.CreateObject("WScript.Shell")
    Set xlApp = CreateObject("Excel.Application") 
    xlApp.Visible = True
    xlApp.Workbooks.Add    
    xlApp.Cells(1, 1).Value = "Domain Computer"
    xlApp.Cells(1, 2).Value = "Domain Role"
    xlApp.Cells(1, 3).value="ProcessorFamily"
    xlApp.Cells(1, 4).value="ProcessorClock"
    xlApp.Cells(1, 5).Value ="RAM"
    xlApp.Cells(1, 6).Value = "HDD(s)"

    Dim Container 
    DomainName=InputBox("Ваш домен пожалуйста")
    'DomainName="ixb"
    Set Container = GetObject("WinNT://" & DomainName)
    Container.Filter = Array("Computer")
    i=2
    For Each Obj In Container
        xlApp.Cells(i, 1).Value = Obj.Name
        if Avaible(Obj.Name) then
            xlApp.Cells(i, 2).Value = Role(Obj.Name)
            xlApp.Cells(i, 3).value=ProcessorFamily(Obj.Name)
            xlApp.Cells(i, 4).value=ProcessorClock(Obj.Name)
            xlApp.Cells(i, 5).Value = GetMemSize(Obj.Name)                                    
            xlApp.Cells(i, 6).Value = GetDisksSize(Obj.Name)            
        end if
        i=i+1
    Next    
    WScript.sleep 2000
    Set xlApp = Nothing 
    </script>
</job>
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

2

Re: VBScript: собираем информацию о компьютерах домена

Те же скрипты, но несколько расширенные. Собирается информация:
- роль в домене
- семейство процессора
- частота процессора
- размер оперативной памяти
- размер жестких диков
- модель видео контроллера
- текущие IP
- MAC адрес
- тип памяти
- список шар
- список установленного софта
- информация об операционке
- номер сервис-пака
- информация об установленных хот-фиксах

Спасибо Ganzales, MoonRabbit, tvm.

info.vbs

function Avaible (name) 'пингом проверяет доступность компьютера name в сети
    on error resume next
    Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}")._
        ExecQuery("select * from Win32_PingStatus where address = '"_
            & name & "'")
    For Each objStatus in objPing
        If IsNull(objStatus.StatusCode) or objStatus.StatusCode<>0 Then 
            Avaible=false
        else
            Avaible=true
        End If
    Next
End Function

'Function IsWinNT(name) 'NT ли на компьютере name
'    On Error Resume Next
'    Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&name&"\root\CIMV2")
'    For Each objOS In objService.ExecQuery("SELECT * FROM Win32_OperatingSystem")
'        Exit For
'    Next
'    '16 - WIN95, 17 - WIN98, 18 - WINNT, 19 - WINCE
'    if objOS.OSType=18 Then
'        IsWinNT=True
'    Else
'        IsWinNT=False
'    end If
'End function

function Role (name) ' возвращет роль компьютера name в домене
    on error resume next
    Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&name&"\root\CIMV2")
    If Err.Number = 0 Then
        For Each objOS In objService.ExecQuery("SELECT * FROM Win32_ComputerSystem")
        Select Case objOS.DomainRole
        Case "0" Role="Standalone Workstation"
        Case "1" Role="Рабочее место"
        Case "2" Role="Standalone Server"
        Case "3" Role="Member Server"
        Case "4" Role="Сервер"
        Case "5" Role="Сервер"
        End Select
        Next
    end if    
End function

function ProcessorFamily (name) 'возвращает название процессора компьютера name 
    On Error Resume Next
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & name & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor")
    For Each objItem in colItems    
        ProcessorFamily=objItem.Name
    Next
end function

function ProcessorClock (name) 'возвращает частоту процессора name 
    On Error Resume Next
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & name & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor")
    For Each objItem in colItems
        ProcessorClock=objItem.CurrentClockSpeed
    Next
end function

function GetMemSize (name) 'возвращает размер оперативной памяти комьютера name
    on error resume next
    Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&name&"\root\CIMV2")
    If Err.Number = 0 Then
        For Each objOS In objService.ExecQuery("SELECT * FROM Win32_ComputerSystem")
        GetMemSize=objOS.TotalPhysicalMemory/1024/1024
        Next
    end if    
End function

function GetDisksSize(name) 'возвращает размер НЖМД компьюетра name, если их несолько то все через пробел
    size=""
    on error resume next
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & name & "\root\cimv2")
    Set colDiskDrives = objWMIService.ExecQuery _    
        ("Select * from Win32_DiskDrive")
    For each objDiskDrive in colDiskDrives       
        size=size&" "&round(objDiskDrive.Size/1024/1024/1024)
    Next
    GetDisksSize=size
end function

'==================================================================================================

function GetVideoProc (name) 'возвращает модель видео контроллера
    on error resume next
    Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&name&"\root\CIMV2")
    If Err.Number = 0 Then
        For Each objOS In objService.ExecQuery("SELECT * FROM Win32_VideoController")
            GetVideoProc=objOS.Description
        Next
    end if    
End Function

function GetCurentIp (name) 'возвращает текущие IP машины
    CurentIps = ""
    on error resume next
    Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&name&"\root\CIMV2")
    If Err.Number = 0 Then
        For Each objOS In objService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration")
            For Each  IP In objOS.IPAddress
                CurentIps = CurentIps & IP & "; "
            Next
        Next
    end If
    GetCurentIp = Trim(CurentIps)
End Function

function GetCurentMAC (name) 'возвращает MAC адрес адаптера
    on error resume next
    Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&name&"\root\CIMV2")
    If Err.Number = 0 Then
        For Each objOS In objService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration")
            GetCurentMAC = objOS.MACAddress
        Next
    end if    
End Function

function GetMemoryType (name) 'возвращает тип памяти (<533 DDR1 >=533 DDR2)
    on error resume next
    Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&name&"\root\CIMV2")
    If Err.Number = 0 Then
        For Each objOS In objService.ExecQuery("SELECT * FROM Win32_PhysicalMemory")
            GetMemoryType = objOS.Speed
        Next
    end if    
End Function

'==================================================================================================

function GetShares (name) 'возвращает список шар
    Shares = ""
    on error resume next
    Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&name&"\root\CIMV2")
    If Err.Number = 0 Then
        For Each objOS In objService.ExecQuery("SELECT * FROM Win32_Share")
            Shares = Shares & objOS.Name & " " & objOS.Path & "; "
        Next
    end if    
    GetShares = Trim(Shares)
End Function

'==================================================================================================

function GetSoft (name) 'возвращает список установленного софта
    Soft = ""
    on error resume next
    Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&name&"\root\CIMV2")
    If Err.Number = 0 Then
        For Each objOS In objService.ExecQuery("SELECT * FROM Win32_Product")
            Soft = Soft & objOS.Caption & " " & objOS.Version & " " & objOS.InstallLocation & " " & objOS.PackageCache & "; "
        Next
    end if    
    GetSoft = Trim(Soft)
End Function

function GetOS (name) 'возвращает информацию об операционке
    Info = ""
    on error resume next
    Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&name&"\root\CIMV2")
    If Err.Number = 0 Then
        For Each objOS In objService.ExecQuery("SELECT * FROM Win32_OperatingSystem")
            Info = Info & objOS.Caption & " " & objOS.Version & " " & objOS.CodeSet & " " & objOS.OSLanguage & " " & objOS.SerialNumber & "; "
        Next
    end if    
    GetOS = Trim(Info)
End Function

function GetSP (name) 'возвращает номер сервис-пака
    on error resume next
    Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&name&"\root\CIMV2")
    If Err.Number = 0 Then
        For Each objOS In objService.ExecQuery("SELECT * FROM Win32_OperatingSystem")
            GetSP = objOS.ServicePackMajorVersion & "." & objOS.ServicePackMinorVersion
        Next
    end if    
End Function

function GetQuickFix (name) 'возвращает информацию об установленных хот-фиксах
    Info = ""
    on error resume next
    Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&name&"\root\CIMV2")
    If Err.Number = 0 Then
        For Each objOS In objService.ExecQuery("SELECT * FROM Win32_QuickFixEngineering")
            Info = Info & objOS.HotFixID & " "
        Next
    end if    
    GetQuickFix = Trim(Info)
End Function

prosto v EXCEL.wsf

    Set WshShell = WScript.CreateObject("WScript.Shell")
    Set xlApp = CreateObject("Excel.Application") 
    xlApp.Visible = True
    xlApp.Workbooks.Add    
    xlApp.Cells(1, 1).Value = "Domain Computer"
    xlApp.Cells(1, 2).Value = "Domain Role"
    xlApp.Cells(1, 3).value="ProcessorFamily"
    xlApp.Cells(1, 4).value="ProcessorClock"
    xlApp.Cells(1, 5).Value ="RAM"
    xlApp.Cells(1, 6).Value = "HDD(s)"
    xlApp.Cells(1, 7).Value = "Video"
    xlApp.Cells(1, 8).Value = "IP(s)"
    xlApp.Cells(1, 9).Value = "MAC"
    xlApp.Cells(1, 10).Value = "Memory"
    xlApp.Cells(1, 11).Value = "Shares"
    xlApp.Cells(1, 12).Value = "Soft"
    xlApp.Cells(1, 13).Value = "OS"
    xlApp.Cells(1, 14).Value = "SP"
    xlApp.Cells(1, 15).Value = "HotFixID(s)"

    Dim Container 
    DomainName=InputBox("Ваш домен пожалуйста")
    'DomainName="ixb"
    Set Container = GetObject("WinNT://" & DomainName)
    Container.Filter = Array("Computer")
    i=2
    For Each Obj In Container
        xlApp.Cells(i, 1).Value = Obj.Name
        if Avaible(Obj.Name) then
            xlApp.Cells(i, 2).Value = Role(Obj.Name)
            xlApp.Cells(i, 3).value = ProcessorFamily(Obj.Name)
            xlApp.Cells(i, 4).value = ProcessorClock(Obj.Name)
            xlApp.Cells(i, 5).Value = GetMemSize(Obj.Name)
            xlApp.Cells(i, 6).Value = GetDisksSize(Obj.Name)
            xlApp.Cells(i, 7).Value = GetVideoProc(Obj.Name)
            xlApp.Cells(i, 8).Value = GetCurentIp(Obj.Name)
            xlApp.Cells(i, 9).Value = GetCurentMAC(Obj.Name)
            xlApp.Cells(i, 10).Value = GetMemoryType(Obj.Name)
            xlApp.Cells(i, 11).Value = GetShares(Obj.Name)
            xlApp.Cells(i, 12).Value = GetSoft(Obj.Name)
            xlApp.Cells(i, 13).Value = GetOS(Obj.Name)
            xlApp.Cells(i, 14).Value = GetSP(Obj.Name)
            xlApp.Cells(i, 15).Value = GetQuickFix(Obj.Name)
        end if
        i=i+1
    Next
    xlApp.Cells(i, 1).Value = Now
    WScript.sleep 2000
    Set xlApp = Nothing
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

3

Re: VBScript: собираем информацию о компьютерах домена

Объект "PCHealth.BugRepSysInfo" расположен в библиотеке C:\WINDOWS\pchealth\helpctr\binaries\brpinfo.dll (WinXP SP2) и позволяет собрать некотоые сведения об операционной системе:

Set objPCHealth = CreateObject("PCHealth.BugRepSysInfo")
WScript.Echo objPCHealth.GetLanguageID 'язык операционной системы
WScript.Echo objPCHealth.GetOSVersionString 'номер версии операционной системы с указанием сервис-пака
WScript.Echo objPCHealth.GetUserDefaultLCID 'язык установленной локали
WScript.Echo objPCHealth.GetActiveCP 'основная кодовая страница
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

4

Re: VBScript: собираем информацию о компьютерах домена

Объект "Msinfo32.MSInfo" расположен в библиотеке C:\WINDOWS\pchealth\helpctr\binaries\msinfo.dll (WinXP SP2) и позволяет сохранить в файл достаточно обширную информацию, аналогичную той, которую можно видеть в программе "Сведения о системе" (меню "Пуск" - "Программы" - "Стандартные" - "Служебные" - "Сведения о системе").

Set objMSInfo = CreateObject("Msinfo32.MSInfo")
' objMSInfo.UpdateDCOProgress(Null)
objMSInfo.SaveFile "C:\Temp\test.txt", "ComputerName", 0 ' 0 - кратко, "" - полно

Вместо "ComputerName" можно использовать ".", что будет означать текущий компьютер. Если недостаточно прав для обращения к удалённому компьютеру, скрипт может приводить к краху Windows Script Host.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

5

Re: VBScript: собираем информацию о компьютерах домена

Ещё один пример: сбор информации о процессорах, памяти, дисках, видео и BIOS текущего компьютера. Вывод осуществляется в окно Internet Explorer с помощью объекта "InternetExplorer.Application".

On Error Resume Next
strComputer ="."
Set oIE = WScript.CreateObject("InternetExplorer.Application")
oIE.Navigate "about:blank"
oIE.Visible = 1
oIE.ToolBar = 0
oIE.StatusBar = 0
oIE.Width = 600
oIE.Height = 500
oIE.StatusBar = 0
oIE.AddressBar = 0

oIE.Document.Write "<html><title>Hardware</title><body bgcolor=#034e85><font color=White>"

'Опрашиваем системные переменные окружения
set oShell = CreateObject("WScript.Shell") 

sCurrUsrPath = oShell.ExpandEnvironmentStrings("%UserName%")
oIE.Document.Write "Имя пользователя: "
oIE.Document.Write sCurrUsrPath
oIE.Document.Write "<br>"

sCurrUsrPath = oShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
oIE.Document.Write"Имя компютера: "
oIE.Document.Write sCurrUsrPath
oIE.Document.Write "<br>"

'Подлючение к WMI
Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/cimv2")

'Выборка информации о процессорах
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor", , 48)
For Each objItem in colItems
    strMsg = strMsg & objItem.Name & "<br>"
Next

'Выборка информации о памяти
Set colItems = objWMIService.ExecQuery("Select * from Win32_LogicalMemoryConfiguration", , 48)
For Each objItem in colItems
    strMsg2 = strMsg2 & (objItem.TotalPhysicalMemory + 1023) / 1024 & "<br>"
Next

'Выюорка информации о диске
Set colItems = objWMIService.ExecQuery("Select * from Win32_DiskDrive", , 48)
For Each objItem in colItems
    strMsg3 = strMsg3 & ((objItem.Size + 536870912) / 1073741824) & " GB" & "<br>"
Next

'Выборка информации об установленном видео
Set colItems = objWMIService.ExecQuery("Select * from Win32_VideoController", , 48)
For Each objItem in colItems
    strMsg4 = strMsg4 & objItem.Name & "<br>"
Next

'Выборка информации BIOS
Set colItems = objWMIService.ExecQuery("Select * from Win32_BIOS where PrimaryBIOS = true", , 48)
For Each objItem in colItems
    strMsg5 = strMsg5 & objItem.Manufacturer & "-" & objItem.Version & "<br>"
Next

'Вывод
oIE.Document.Write "<br>"
oIE.Document.Write "Процессоры<br>"
oIE.Document.Write strMsg
oIE.Document.Write "<br>"
oIE.Document.Write "Память<br>"
oIE.Document.Write strMsg2
oIE.Document.Write "<br>"
oIE.Document.Write "Диски<br>"
oIE.Document.Write strMsg3
oIE.Document.Write "<br>"
oIE.Document.Write "Видео<br>"
oIE.Document.Write strMsg4
oIE.Document.Write "<br>"
oIE.Document.Write "Биос<br>"
oIE.Document.Write strMsg5

oIE.Document.Write"</font></body></html>"

Автор примера - wictor.
Примечание: при использовании WSH ниже 5.7 может потребоваться явное приведение значений к строкам при выводе, например, "oIE.Document.Write CStr(sCurrUsrPath)" вместо "oIE.Document.Write sCurrUsrPath".

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

6

Re: VBScript: собираем информацию о компьютерах домена

Сбор информации о физической памяти (ОЗУ) текущего компьютера с помощью WMI:

Option Explicit

Dim strComputer
Dim arrMemoryType
Dim dictTypeDetail

Dim objSWbemServices
Dim collSWbemObjectSet
Dim objSWbemObjectSet

arrMemoryType = Array("Unknown", "Other", "DRAM", "Synchronous DRAM", "Cache DRAM", "EDO", "EDRAM", "VRAM", _
    "SRAM", "RAM", "ROM", "Flash", "EEPROM", "FEPROM", "EPROM", "CDRAM", "3DRAM", "SDRAM", "SGRAM", "RDRAM", "DDR")
    
Set dictTypeDetail = CreateObject("Scripting.Dictionary")

With dictTypeDetail
    .Add "0x1", "Reserved"
    .Add "0x2", "Other"
    .Add "0x4", "Unknown"
    .Add "0x8", "Fast-paged"
    .Add "0x10", "Static column"
    .Add "0x20", "Pseudo-static"
    .Add "0x40", "RAMBUS"
    .Add "0x80", "Synchronous"
    .Add "0x100", "CMOS"
    .Add "0x200", "EDO"
    .Add "0x400", "Window DRAM"
    .Add "0x800", "Cache DRAM"
    .Add "0x1000", "Non-volatile"
End With

strComputer = "."


Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set collSWbemObjectSet = objSWbemServices.ExecQuery("SELECT * FROM Win32_PhysicalMemory")

For Each objSWbemObjectSet In collSWbemObjectSet
    With objSWbemObjectSet
        Wscript.Echo "-----------------------------------"
        Wscript.Echo "Win32_PhysicalMemory instance"
        Wscript.Echo "-----------------------------------"
        Wscript.Echo "BankLabel: ",            .BankLabel
        Wscript.Echo "Capacity: ",              FormatNumber(.Capacity, 0)
        Wscript.Echo "DataWidth: ",            .DataWidth
        Wscript.Echo "Description: ",          .Description
        Wscript.Echo "DeviceLocator: ",        .DeviceLocator
        Wscript.Echo "FormFactor: ",           .FormFactor
        Wscript.Echo "Manufacturer: ",         .Manufacturer
        Wscript.Echo "MemoryType: ",            arrMemoryType(.MemoryType)
        Wscript.Echo "Model: ",                .Model
        Wscript.Echo "Name: ",                 .Name
        Wscript.Echo "OtherIdentifyingInfo: ", .OtherIdentifyingInfo
        Wscript.Echo "PartNumber: ",           .PartNumber
        Wscript.Echo "SerialNumber: ",         .SerialNumber
        Wscript.Echo "Speed: ",                .Speed
        Wscript.Echo "TotalWidth: ",           .TotalWidth
        Wscript.Echo "TypeDetail: ",           dictTypeDetail.Item("0x" & Hex(.TypeDetail))
    End With
Next

dictTypeDetail.RemoveAll

Set dictTypeDetail = Nothing
Set collSWbemObjectSet = Nothing
Set objSWbemServices = Nothing

WScript.Quit 0

Примечание: информация о «железе», полученная через WMI, иногда может как просто отсутствовать, так и фактически не соответствовать действительности.
Автор примера - alexii.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

7

Re: VBScript: собираем информацию о компьютерах домена

Сбор информации о физической памяти (ОЗУ) текущего компьютера с помощью бесплатной утилиты http://www.cpuid.com/cpuz.php (предварительной инсталляции не требует, но на запуск, скорее всего, потребуются административные права):

Option Explicit

Const strFileName = "c:\out" ' Путь и имя файла без расширения (таковы особенности :) CPU-Z)
                             ' А, вообще-то, нужно генерировать Temp-файл (http://forum.script-coding.com/viewtopic.php?pid=9523#p9523).
Const ForReading = 1

Dim objWshShell
Dim objFSO
Dim objTS
Dim objRegExp
Dim collMatches
Dim objMatch
Dim strSubMatchItem

Dim strContent

Set objWshShell = WScript.CreateObject("WScript.Shell")
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

' Из документации CPU-Z:
'… -txt=filename : Launch CPU-Z in ghost mode (no interface appears) and generates the register dump file (.txt) …
'
' В предположении, что CPU-Z установлен в %ProgramFiles%\CPU-Z\:
objWshShell.Run """" & objWshShell.ExpandEnvironmentStrings("%ProgramFiles%") & "\CPU-Z\cpuz.exe"" -txt=" & strFileName & "", 1, True

' Читаем вывод и удаляем файл
If objFSO.FileExists(strFileName & ".txt") Then
    Set objTS = objFSO.OpenTextFile(strFileName & ".txt", ForReading)
    
    strContent = objTS.ReadAll()
    objTS.Close
    
    Set objTS = Nothing
    
    objFSO.DeleteFile strFileName & ".txt"
End If

' Ищем нужные данные посредством регулярных выражений
Set objRegExp = New RegExp

With objRegExp
    .Global = False
    .IgnoreCase = True
    
    .Pattern = ".*Memory Type[\s\S]*?Memory Size[\s\S]*?Channels[\s\S]*?Memory Frequency[\s\S]*?.*"
    
    Set collMatches = .Execute(strContent)
    
    WScript.Echo collMatches.Item(0)
    
    Set collMatches = Nothing
End With

' Таким же образом можно получить и данные по характеристикам отдельных модулей памяти
With objRegExp
    .Global = True
    .IgnoreCase = True
    .Pattern = ".*" & _
        "(DIMM #\d)[\s\S]*?" & _
        "(Memory type.*)[\s\S]*?" & _
        "(Manufacturer \(ID\).*)[\s\S]*?" & _
        "(Size.*)[\s\S]*?" & _
        "(Max bandwidth.*)[\s\S]*?" & _
        "(Part number.*)[\s\S]*?" & _
        "(Serial number.*).*"
    
    Set collMatches = .Execute(strContent)
    
    For Each objMatch In collMatches
        WScript.Echo
        
        For Each strSubMatchItem In objMatch.SubMatches
            WScript.Echo strSubMatchItem
        Next
    Next
    
    Set collMatches = Nothing
End With


Set objRegExp = Nothing
Set objFSO = Nothing
Set objWshShell = Nothing

WScript.Quit 0

Автор примера - alexii.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

8

Re: VBScript: собираем информацию о компьютерах домена

Пример получения системной информации с помощью компонента JSSys3.dll (версия ОС, установленная и использованная память, имя пользователя и компьютера, общий и свободный объём локальных дисков, полный путь к исполняемому файлу указанной программы по имени исполняемого файла или ассоциированному расширению, глубина цвета экрана, цветовые настройки элементов интерфейса, установленное разрешение экрана):

Set oSys = CreateObject("JSSys3.Ops")
errCode = oSys.GetOpVersion(Arr) ' 0 - OK, 1 - failed
WScript.Echo Arr(0) ' Platform: 1 - 9x, 2 - NT
WScript.Echo Arr(1) ' Major Version
WScript.Echo Arr(2) ' Minor Version
WScript.Echo Arr(3) ' Build Number
WScript.Echo Arr(4) ' Service pack
errCode = oSys.GetMemory(t, u) ' 0 - OK, 1 - failed
WScript.Echo "installed RAM in MB: " & t
WScript.Echo "RAM currently used, in MB: " & u
WScript.Echo "current user: " & oSys.GetCurUser()
WScript.Echo "current computer: " & oSys.GetCompName()
WScript.Echo oSys.GetDriveInfo() ' fixed drive letters, total size, free space
WScript.Echo "=============================="
' путь к исполняемому файлу программы, ассоциированной с указанным расширением:
WScript.Echo oSys.GetDefaultProgram("txt")
' глубина цвета в битах ("Качество цветопередачи", Свойства Экрана, вкладка "Параметры"):
WScript.Echo oSys.GetColorDepthBPP()
' реальное разрешение (размер) экрана, без панели задач:
errCode = oSys.GetDesktopPixels(w, h)
WScript.Echo w & " х " & h
' разрешение экрана:
errCode = oSys.GetScreenPixels(w, h)
WScript.Echo w & " х " & h
' цвет Рабочего стола (6-символьная строка, hex):
WScript.Echo oSys.GetSystemColor("Desktop")
' (возможно получение цвета 16-и различных элементов, см. документацию)
' полный путь к исполняемому файлу указанной программы:
WScript.Echo oSys.GetEXEPath("winword.exe")
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

9

Re: VBScript: собираем информацию о компьютерах домена

Небольшой бесплатный набор компонентов System Scripting Runtime предназначен для работы с сетью и локальной системой. Документацию с описанием всех возможностей и дистрибутив (архив порядка 250 Кб) вы найдёте по приведённой ссылке.

Объект SScripting.System позволяет получить некоторую системную информацию, информацию о дисках, а также установить время на компьютере, выключить/перезагрузить компьютер различными способами. Пример использования:

Set oSys = CreateObject("SScripting.System")
WScript.Echo oSys.CurrentDirectory ' текущий каталог
WScript.Echo oSys.OperatingSystem ' версия ОС, Build, Service Pack
WScript.Echo oSys.ProcessorCount ' количество процессоров
WScript.Echo oSys.ProcessorDescription ' описание процессора, тактовая частота
' тип ОС (-1 - неизвестно, 0 - рабочая станция, 1 - сервер, 2 - контроллер домена):
WScript.Echo oSys.ProductType
WScript.Echo oSys.SystemDirectory ' например, C:\WINDOWS\system32
WScript.Echo oSys.TempPath ' путь ко временному каталогу пользователя
WScript.Echo oSys.TotalMemory ' размер установленной RAM в Мб
WScript.Echo oSys.UserName ' текущий пользователь
WScript.Echo oSys.WindowsDirectory ' например, C:\WINDOWS
WScript.Echo oSys.GetLocalTime() ' местное время
WScript.Echo oSys.GetSystemTime() ' время без учёта пояса
' информация о типе указанного диска
' (0 - неизвестно, 1 - не существует, 2 - съёмный, 3 - жёсткий, 4 - сетевой, 5 - CD-ROM, 6 - RAM)
WScript.Echo oSys.GetDriveType("C:\")
WScript.Echo oSys.GetFreeDiskSpace("C:\") ' свободное место, в Кб
WScript.Echo oSys.GetTotalDiskSpace("C:\") ' общий объём, в Кб
' (можно использовать UNC-пути)

Объект SScripting.IPNetwork предназначен для работы с сетью. Пример использования:

Set oSys = CreateObject("SScripting.IPNetwork")
WScript.Echo oSys.Hostname ' имя компьютера
WScript.Echo oSys.Domain ' DNS domain name, если есть
WScript.Echo oSys.DNSLookup("localhost") ' 127.0.0.1
WScript.Echo oSys.DNSLookup("127.0.0.1") ' localhost
WScript.Echo oSys.DNSLookup("script-coding.com")
For Each elem In oSys.DNSLookupEx("google.ru")
    WScript.Echo "google.ru " & elem
Next
' Ping (0 - успешно, 10 - недоступен, 20 - превышено время, 30 - нет ответа (таймаут),
' 100 - неверные параметры, 110 - SocketError, 120 - неверный адрес)
' Есть ряд опциональных параметров (см. документацию)
WScript.Echo oSys.Ping("127.0.0.1")

Объект SScripting.LMNetwork также предназначен для работы с сетью. Пример использования:

Set oSys = CreateObject("SScripting.LMNetwork")
WScript.Echo oSys.ComputerName ' NetBIOS имя компьютера
suc = oSys.SendNetMessage("domain*", "text of message") ' аналог net send
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.