Форум программистов, компьютерный форум, киберфорум
Наши страницы

VBScript/JScript/WSH/WMI/HTA

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.82
mutex
28 / 28 / 4
Регистрация: 18.04.2009
Сообщений: 260
#1

Версия системы в VBS для WSH - VBScript/JScript

01.08.2012, 11:04. Просмотров 3094. Ответов 10
Метки нет (Все метки)

Доброго времени суток уважаемые форумчане !
Не нашел на форуме раздела по созданию скриптов для Windows Script Host, поэтому пишу сюда.
Как на vbs получить версию операционной системы и список всех учётных записей имеющихся на компьютере?
И не подскажете ли хорошую документацию по классам для этого языка? На сайте microsoft в MSDN чего то не смог найти. Там в основном все для используемых в Visual Studio.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2012, 11:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Версия системы в VBS для WSH (VBScript/JScript):

WSH.VBS запустить программу и не дожидаться ее завршения? - VBScript/JScript
Надо запустить скрипт, который создает OLE-объект программы и запускает один из мтеодов объекта. Надо чтобы скрипт завершил свое выполнение...

VBS Отправка e-mail через SMTP-сервер - VBScript/JScript/WSH/WMI/HTA - VBScript/JScript
Помогите, при запуске скрипта возникает ошибка Option Explicit 'Содание объекта CDO Dim objmes Set...

Программа на VBScript (WSH) для генерации пароля - VBScript/JScript
Добрый вечер. помогите с написанием программы на VBScript (WSH) для генерации пароля. Условия: На вход подается длина пароля....

Создание бинарного файла из vbs / Как создать exe файл из vbs - VBScript/JScript
Имеется файл с расширением exe. Нужно как-нибудь занести массив байт в скрипт, и чтоб потом этот файл создавался при запуске vbs

нужна ли лицензия для VBS - VBScript/JScript
Подскажите, кто сталкивался: если Windows куплена честно по корпоративной лицензии, и для создания скрипта на VBS нечего не используется...

VBS Подскажите IDE для VBS - VBScript/JScript
Подскажите программу для скриптов vbs/jscript Чтоб имела подсказки как в visual studia или Resharper уневерсальную прогу ,...

10
Dmitrii
2596 / 529 / 104
Регистрация: 21.03.2012
Сообщений: 1,021
01.08.2012, 16:22 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от mutex Посмотреть сообщение
... Как на vbs получить версию операционной системы и список всех учётных записей имеющихся на компьютере?..
Один из возможных вариантов:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Dim objWShell, objComputer, strDomain, strComputer, strList, strTemp
Set objWShell = CreateObject("WScript.Shell")
WScript.Echo "Версия ОС: " & objWShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName")
strDomain = objWShell.ExpandEnvironmentStrings("%UserDomain%")
strComputer = objWShell.ExpandEnvironmentStrings("%ComputerName%")
Set objWShell = Nothing
If StrComp(strDomain, strComputer, vbTextCompare) <> 0 Then
    strTemp = "WinNT://" & strDomain & "/" & strComputer & ",computer"
Else
    strTemp = "WinNT://" & strComputer & ",computer"
End If
Set objComputer = GetObject(strTemp)
For Each objItem In objComputer
    If StrComp(objItem.Class, "user", vbTextCompare) = 0 Then
        strList = strList & vbNewLine & objItem.Name
    End If
Next
Set objComputer = Nothing
WScript.Echo "Локальные пользователи:" & vbNewLine & strList
WScript.Quit 0
2
mutex
28 / 28 / 4
Регистрация: 18.04.2009
Сообщений: 260
01.08.2012, 17:16  [ТС] #3
Самое то.
Только я не полно описал задачу. Как вывести имена пользователей, чьи профили имеются на компьютере, помимо локальных? Например если на компьютере используется доменная учётная запись.
0
Dmitrii
2596 / 529 / 104
Регистрация: 21.03.2012
Сообщений: 1,021
01.08.2012, 17:44 #4
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Dim objWShell, objComputer, objFS
Dim strDomain, strComputer, strList, strProfiles, strTemp
strExclude = "All Users;Default User;LocalService;NetworkService;"
Set objWShell = CreateObject("WScript.Shell")
WScript.Echo "Версия ОС: " & objWShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName")
strDomain = objWShell.ExpandEnvironmentStrings("%UserDomain%")
strComputer = objWShell.ExpandEnvironmentStrings("%ComputerName%")
If StrComp(strDomain, strComputer, vbTextCompare) <> 0 Then
    strTemp = "WinNT://" & strDomain & "/" & strComputer & ",computer"
Else
    strTemp = "WinNT://" & strComputer & ",computer"
End If
Set objComputer = GetObject(strTemp)
For Each objItem In objComputer
    If StrComp(objItem.Class, "user", vbTextCompare) = 0 Then
        strList = strList & vbNewLine & objItem.Name
    End If
Next
Set objComputer = Nothing
WScript.Echo "Локальные пользователи:" & vbNewLine & strList
strTemp = objWShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\ProfilesDirectory")
strTemp = Replace(strTemp, "%SystemDrive%", objWShell.ExpandEnvironmentStrings("%SystemDrive%"))
Set objWShell = Nothing
Set objFS = CreateObject("Scripting.FileSystemObject")
If objFS.FolderExists(strTemp) Then
    For Each objItem In objFS.GetFolder(strTemp).SubFolders
        If InStr(1, strExclude, objItem.Name & ";", vbTextCompare) = 0 Then
            'If InStr(1, strList, objItem.Name, vbTextCompare) = 0 Then
                strProfiles = strProfiles & vbNewLine & objItem.Name
            'End If
        End If
    Next
    WScript.Echo "Папки профилей пользователей:" & vbNewLine & strProfiles
End If
Set objFS = Nothing
WScript.Quit 0
Если из списка профилей надо исключить профили локальных пользователей, то "раскомментируйте" соответствующий условный оператор.
2
mutex
28 / 28 / 4
Регистрация: 18.04.2009
Сообщений: 260
08.02.2014, 17:54  [ТС] #5
Использовал я скрипт без проблем, пока не столкнулся со следующей ситуацией. Имя одного из локальных пользователей ПК изменили, но имя папки профиля при этом не поменялось. Получается что имя пользователя не совпадает с именем папки профиля этого же пользователя.
0
Dmitrii
2596 / 529 / 104
Регистрация: 21.03.2012
Сообщений: 1,021
10.02.2014, 00:16 #6
mutex, попробуйте для начала такую заготовку (на том компьютере, где локальный пользователь был переименован):
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dim objWShell, objWMI, objCollection, objItem, strList, strTemp
Set objWShell = CreateObject("WScript.Shell")
Set objWMI = GetObject("winmgmts:\\.\root\CIMV2")
Set objCollection = objWMI.ExecQuery("SELECT Name,SID FROM Win32_UserAccount WHERE LocalAccount=True")
On Error Resume Next
For Each objItem In objCollection
    strTemp = objWShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\" & _
                objItem.SID & "\ProfileImagePath")
    If Err.Number = 0 Then
        strList = strList & objItem.Name & " -> " & strTemp & vbNewLine
    Else
        Err.Clear
    End If
Next
On Error GoTo 0
strList = Replace(strList, "%SystemDrive%", objWShell.ExpandEnvironmentStrings("%SystemDrive%"))
WScript.Echo strList
Set objItem = Nothing: Set objCollection = Nothing: Set objWMI = Nothing: Set objWShell = Nothing
WScript.Quit 0
2
mutex
28 / 28 / 4
Регистрация: 18.04.2009
Сообщений: 260
06.03.2014, 14:44  [ТС] #7
Пробывал. Не то выводит. Судя по всему параметр LocalAccount=True в запросе отсекает доменных пользователей. В списке только те пользоователи, которых можно найти в Управлении компьютером в узле Пользователи. Короче говоря только локальные.

Возможно как то по имеющимся в реестре SID вывести соответствующие им имена пользователей ?

Добавлено через 5 минут
Как бы подцепиться к списку который находиться в свойствах компьютера на вкладке "Допольнительно". Когда нажимаешь кнопку Параметры в области "Профили пользователей". Это как раз то, что надо.
0
Dmitrii
2596 / 529 / 104
Регистрация: 21.03.2012
Сообщений: 1,021
06.03.2014, 20:12 #8
Цитата Сообщение от mutex Посмотреть сообщение
... Судя по всему параметр LocalAccount=True в запросе отсекает доменных пользователей...
Ну да. Ведь было же задано дополнительное условие:
Цитата Сообщение от mutex Посмотреть сообщение
... Имя одного из локальных пользователей ПК изменили...
Поэтому я и предложил попробовать решить конкретно эту задачу указанным тестовым сценарием. Чтобы обработать все "учётки" упростите запрос:
Visual Basic
1
Set objCollection = objWMI.ExecQuery("SELECT Name,SID FROM Win32_UserAccount")
Если с помощью этой тестовой заготовки удастся добиться желаемого результата, можно будет на её основе переделать сценарий, предложенный в сообщении #4.
1
mutex
28 / 28 / 4
Регистрация: 18.04.2009
Сообщений: 260
10.03.2014, 17:57  [ТС] #9
Я ранее пробовал такой вариант
Visual Basic
1
Set objCollection = objWMI.ExecQuery("SELECT * FROM Win32_UserAccount")
Так как этот скрипт приходится исполнять на ПК находящимся в домене, то выполняется он очень долго. И в итоге выдаёт около 50 пользователей. Почему так я не понимаю. В этом списке есть доменные пользователи которые никогда на этот ПК и не входили.
В связи с этим и хотелось бы сделать так, чтобы скрипт работал только с локальной информацией.
Завтра попробую вариант запроса с определением явных столбцов Name и SID в SQL запросе. Может это хотя бы сократить время выполнения.

Добавлено через 32 минуты
Попробовал такой код
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
' Объявляем переменные
Dim objWMIService, Users, User, i
Dim UsersArray()
Dim tempstr, st
Dim WshShell, userNumber
Dim correct
 
' Находим имеющиеся профили пользователей
' Попробуем сделать это с использованием класса Win32_SID
i = -1
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set Users = objWMIService.ExecQuery("Select * from Win32_SID")
For Each User in Users
    i = i + 1
    ReDim Preserve UsersArray(i)
    UsersArray(i) = User.AccountName
Next
Но он не работает. Судя по всему результат запроса равен null. Почему так?
0
Dmitrii
2596 / 529 / 104
Регистрация: 21.03.2012
Сообщений: 1,021
10.03.2014, 18:45 #10
Цитата Сообщение от mutex Посмотреть сообщение
... выполняется он очень долго...
В нашем домене работает быстро (менее секунды), впрочем, у нас не более 100 доменных "учёток". Кроме того, фильтр по атрибутам Name и SID уменьшает время составления выборки.
Сколько примерно "учёток" у Вас и как долго работает сценарий (с фильтром по указанным атрибутам)?
Цитата Сообщение от mutex Посмотреть сообщение
... Почему так я не понимаю...
Потому что в домене выборка ведётся по всем экземплярам, относящимся к классу Win32_UserAccount (как локальным для данной станции, так и доменным).
Цитата Сообщение от mutex Посмотреть сообщение
... В этом списке есть доменные пользователи которые никогда на этот ПК и не входили...
Для фильтрации таких экземпляров служит конструкция:
Visual Basic
1
2
3
4
5
6
7
strTemp = objWShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\" & _
            objItem.SID & "\ProfileImagePath")
If Err.Number = 0 Then
    strList = strList & objItem.Name & " -> " & strTemp & vbNewLine
Else
    Err.Clear
End If
Цитата Сообщение от mutex Посмотреть сообщение
... такой код <...> не работает <...> Почему так?
Потому что у класса Win32_SID есть ключевой квалификатор (это свойство SID), без указания которого обращение к конкретному экземпляру класса невозможно. Простое же перечисление всех экземпляров этого класса не поддерживается.
2
mutex
28 / 28 / 4
Регистрация: 18.04.2009
Сообщений: 260
16.03.2014, 19:37  [ТС] #11
Сделал вот так. Выводит пользователей тех которые нужны
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Const HKLM = &H80000002
Const RegistryKey = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
Const strExclude = "система;Local Service;Network Service;"
 
Const Root = "HKEY_LOCAL_MACHINE"                                         ' Корневой ключ
Const Key = "\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\"     ' Раздел
Const ValueName1 = "DefaultUserName"
Const ValueName2 = "DefaultDomainName"
 
Dim i, username
Dim UsersArray()
Dim correct
 
Set oReg = GetObject("winmgmts:\\.\root\default:StdRegProv")
'Подразделы указанного раздела записываем в массив aRegKeys
iRC = oReg.EnumKey(HKLM, RegistryKey, aRegKeys)
 
i = 0
' Перебираем все значения SID ов
For Each sKey In aRegKeys
    userName = GetUser(sKey)
    If InStr(1, strExclude, userName & ";", vbTextCompare) = 0 Then
        i = i + 1
        ReDim Preserve UsersArray(i)
        UsersArray(i-1) = userName  
    End If
Next
ReDim Preserve UsersArray(i-1)
 
tempstr = "Введите цифру логина, который будет логином входа в ОС по умолчанию" & vbNewLine
i = 0
for each st in UsersArray
    i = i + 1
    tempstr = tempstr & vbNewLine & "[" & i & "] " & st
next
 
'Создаём бесконечный цикл
correct = false
do
    userNumber = InputBox(tempstr,"Выбор логина")
    if(userNumber = Empty) then
        correct = true
    else
        if (IsNumeric(userNumber)) then
            if (Int(userNumber > 0)) and (Int(userNumber) < (i+1)) then
                ' Создаем объект WshShell
                Set WshShell = WScript.CreateObject("WScript.Shell")
                ' Записываем новые значения
                WshShell.RegWrite Root & Key & ValueName1, UsersArray(userNumber-1), "REG_SZ"
                WshShell.RegWrite Root & Key & ValueName2, "MyDomain","REG_SZ"
                correct = true
            end if
        end if
    end if
loop until correct
 
'Функция возвращает имя пользователя соответствующее SID
Function GetUser(sid)
    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set objAccount = objWMIService.Get("Win32_SID.SID='" & sid & "'")
    GetUser = objAccount.AccountName
End Function
Но на Windows 7, после перезагрузки, логин пользователя на экране приветствия не поменялся. Логин подставляется тот же, что и до завершения работы Windows.
0
16.03.2014, 19:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2014, 19:37
Привет! Вот еще темы с ответами:

VBS скрипт для перезагрузки ALTUSEN - VBScript/JScript
Доброго всем вечера. Толковые люди данного форума подскажите кто чем может. Ни как не могу разобратся с вопросом. Предисловие: Есть...

Сценарий vbs для чтения данных реестра - VBScript/JScript
Необходимо создать сценарий, обеспечивающий чтение из реестра содержимого любого раздела, параметра и значения параметра. Я знаю, что...

HTML-файл с VBS-кодом для соединения с базой IBM DB2 - VBScript/JScript
Всем привет! В общем такая проблема: написал код HTML-страницы с языком VBScript &lt;HTML&gt; &lt;HEAD&gt; &lt;TITLE&gt;IBM...

Создать vbs скрипт для загрузки файла с сервера на жёсткий диск - VBScript/JScript
как создать vbs скрипт для загрузки файла с сервера на жёсткий диск нужен лиш пример кода грузить будем допустим это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru