Ru-Board.club
← Вернуться в раздел «В помощь системному администратору»

» Автоматизация администрирования. Часть 3

Автор: contrafack
Дата сообщения: 09.03.2012 12:32
wwladimir

неа. че то слишком замудрено... напрягает консоль с дохрена параметрами.
мне как бы попроще..

Добавлено:
Prisoner_of_Ice

ну каждый раз с фильтрами возится - не хочется, часто забываю параметров тоже
Хочется готовую утилиту, батник или что то т.п., которое снимало уже нужную информацию.
Автор: clevergod
Дата сообщения: 05.04.2012 10:44
/Проверка состояния (включения-выключения пк) с отправкой результата на емэйл в виде Computer/LogIN_User.

/1TurnOnPC_Send_Email.vbs:
_______________________________________________________ Код:
Const ForAppending = 8
Dim INPUT_FILE_NAME
Dim rs
Dim Script_Time
INPUT_FILE_NAME = "\\server\TurnOff_Computers\" & CStr(Date) & "_Powered-ON_WS.txt"
Set con = CreateObject("ADODB.Connection")
Set com = CreateObject("ADODB.Command")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile(INPUT_FILE_NAME)
objFile.Close
Set objTextFile = objFSO.OpenTextFile(INPUT_FILE_NAME, ForAppending, True)
Script_Time = Now
objTextFile.WriteLine("Computer_Name;User_Name")
con.Provider = "ADsDSOObject"
con.Properties("ADSI Flag") = 1
con.Open "Active Directory Provider"
Set Com.ActiveConnection = con
com.Properties("Page Size") = 3000
Com.CommandText = "<LDAP://OU=Computers,DC=company,DC=com>;(objectclass=computer);name,location;oneLevel"
Set rs = Com.Execute
Do While rs.EOF = False
Call WSrequest(rs.Fields("name"))
rs.MoveNext
Loop
objTextFile.WriteLine("Script start_time: " & CStr(Script_Time))
objTextFile.WriteLine("Script end_time: " & CStr(Now))
Script_Time = (Now - Script_Time)*24*60
objTextFile.WriteLine("Duration was " & CCur(Script_Time) & " minutes!")
objTextFile.Close
Call send_Mail
' Wscript.Echo "Script is completed!"

Sub WSrequest(nmComp)
On Error Resume Next
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objSWbemLocator.ConnectServer(nmComp, "root\CIMV2",,,,,128)
Set colItems1 = objWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystem",,48)
For Each objItem in colItems1
If IsNull(objItem.Name) then
i = 1
Else
WSinfoStr = objItem.Name & ";" & objItem.UserName
objTextFile.WriteLine(WSinfoStr)
End If
Next
End Sub

Sub send_Mail
strSmtpServer="mail.company.com" ' имя почтового сервера
strSmtpPort=25
strSmtpAuth="no"
strSmtpSsl="no"
strSenderEmail="administrator@company.com" ' Имя отправителя
strRecipientEmail="user@company.com" ' Имя получателя
strAttachment="\\server\TurnOff_Computers\" & CStr(Date) & "_Powered-ON_WS.csv"
'
Set objMessage = CreateObject("CDO.Message")
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSmtpServer
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = strSmtpPort
objMessage.Configuration.Fields.Update
'
objMessage.Subject = "Report of Powered-ON workstations. " & CStr(Date) & "."
objMessage.From = strSenderEmail
objMessage.To = strRecipientEmail
objMessage.HTMLBody = "Body of Report:"
objMessage.AddAttachment strAttachment
objMessage.Send
End Sub


_______________________________________________________
/Выключение ПК по списку

/2TurnOFF_PC.vbs:
_______________________________________________________ Код:
Dim OpSysSet, Flags
Dim IntErrlevel

arrTargetComps = Array("Comp1","Comp2","Comp3")

For Each strTargetComp In arrTargetComps

Set OpSysSet = GetObject("winmgmts:{impersonationLevel=impersonate,(RemoteShutdown)}//" & strTargetComp ).ExecQuery("select * from Win32_OperatingSystem where Primary=true")


' 0-Logoff, 1-Shutdown, 2-Reboot, 4-Force
' 8-Power Off, 16-Force If Hung

Flags = 1 ' Выключаем
IntErrlevel = 0

For Each OpSys In OpSysSet
OpSys.Win32Shutdown Flags,IntErrlevel
Next

Next


_______________________________________________________
/Перебор и вывод на экран компьютеров домена

/3FindPC_inAD.vbs:
_______________________________________________________ Код:
On Error Resume Next
Set Root = GetObject("LDAP://RootDSE")
DomObj = Root.Get("DefaultNamingContext")

Set objConn = CreateObject("ADODB.Connection")
objConn.Provider = "ADsDSOObject"
objConn.Open "Active Directory Provider"

Set objCMD = CreateObject("ADODB.Command")
objCMD.ActiveConnection = objConn
objCMD.CommandText = "<LDAP://" & DomObj & ">;(&(objectClass=computer));name;subtree"
objCMD.Properties("Page Size") = 1000
objCMD.Properties("Timeout") = 30
objCMD.Properties("Cache Results") = False

Set objRS = objCMD.Execute
objRS.MoveFirst
While Not objRS.EOF
wscript.echo objRS.Fields("name")
objRS.MoveNext
Wend


_______________________________________________________

Уважаемые знатоки, необходимо объеденить эти скрипты (1-2-3) для получения мега нужно вещи - как выключение 2 скрипт каждую ночь включенных пк в виде результатов 1 скрипта, с перебором пк в домене 3 скрипта но с исключением допустим OU=Servers.

Пока что реализовано батником:
/TurnOff_Computers.cmd:
_______________________________________________________
FOR /F "eol=; tokens=1" %%i in (\\server\TurnOff_Computers\ComputerList.txt) do ping -n 1 %%i | find "TTL=" && echo %%i >> \\server\TurnOff_Computers\%date%_Computers_ON.txt

FOR /F "eol=; tokens=1" %%i in (\\server\TurnOff_Computers\%date%_Computers_ON.txt) do shutdown -s -f -m \\%%i
_______________________________________________________
Затем vbs по отправке результата на Email

sendMail.vbs:
_______________________________________________________
Set objEmail = CreateObject("CDO.Message")

Dim MyTime
MyTime = Now

Dim Temp
Dim MyDate
Temp = Day(Now)
if (Temp < 10) then MyDate = "0"
MyDate = MyDate & Temp & "."
Temp = Month(Now)
if (Temp < 10) then MyDate = MyDate & "0"
MyDate = MyDate & Temp & "." & Year(Now)

objEmail.From = "administrator@company.com"
objEmail.To = "user@company.com"
objEmail.Subject = "Computers turned on " & MyTime
objEmail.Textbody = ""
objEmail.Addattachment "\\server\TurnOff_Computers\" & MyDate & "_Computers_ON.txt"

objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.company.com"
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objEmail.Configuration.Fields.Update
objEmail.Send
_______________________________________________________, 10) then MyDate = MyDate
Автор: rlogan
Дата сообщения: 11.04.2012 21:32
создал было отдельную тему, а там направили сюда, может кому пригодится.
СУТЬ
Целью разработки программы является упрощение (унификация) администрирования в решении следующей задачи:
Автоматическое построение списка приложений для конечных пользователей (Автоменю). Программа проверяет доступность приложения, если приложение недоступно-соответствующий пункт меню не появляется.
Собственно программа и ее описание здесь http://infostart.ru/public/91323/
Если у кого трудности с infostart-ом - обращайтесь, решим вопрос.
Автор: johnysc3
Дата сообщения: 23.04.2012 15:44
Здравствуйте!
Windows Server 2008 R2, VBS, терминальные пользователи без админ-прав.
Подскажите, пожалуйста, как мне в скрипте vbs увидеть переменные окружения текущего пользователя, если я запускаю скрипт из планировщика с полными правами (галочка "Выполнять с наивысшими правами")?
Подробнее:
Есть скрипт, меняющий временные папки для пользователей в терминале:

Код: const HKEY_CURRENT_USER = &H80000001
strComputer = "."

Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_
strComputer & "\root\default:StdRegProv")

strKeyPath = "Environment"
strValue1Name = "TEMP"
strValue1 = "t:\Temp\" & createobject("wscript.shell").expandenvironmentstrings("%username%")

strValue2Name = "TMP"
strValue2 = "t:\Temp\" & createobject("wscript.shell").expandenvironmentstrings("%username%")

oReg.SetExpandedStringValue _
HKEY_CURRENT_USER,strKeyPath,strValue1Name,strValue1

oReg.SetExpandedStringValue _
HKEY_CURRENT_USER,strKeyPath,strValue2Name,strValue2
Автор: firsteducation
Дата сообщения: 24.04.2012 14:04
кто нибудь подскажет как в батнике автоматизировать загрузку новых файлов электронных сертификатов с майл ру в папку пк, а старые удалять из ящика?
Автор: Ugly_Elvis
Дата сообщения: 27.04.2012 12:25
Гуру, помогите ламеру! Есть вот такой скрипт:
Код: Const MY_COMPUTER = &H11&
Set objNetwork = CreateObject("Wscript.Network")
objComputerName = objNetwork.ComputerName
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(MY_COMPUTER)
Set objFolderItem = objFolder.Self
objFolderItem.Name = "Мой компьютер (" + objComputerName + ")"
Автор: wwladimir
Дата сообщения: 27.04.2012 13:39
Не подскажу, но замену скрипту-легко: http://technet.microsoft.com/en-us/sysinternals/bb897557
Сможете у пользователя вслед за IP еще и хоть MAC адрес вывести, ну или там время включения компа, например...

Инструкция (не моя) -
1. В интерфейсе Bginfo создать нужный конфиг. Обязательно в меню Bitmap > Location выбрать место хранения в юзерском профиле, а не по дефолту.
2. Сохранить конфиг в файл, скажем user.bgi.
3. Написать батник примерно следующего содержания:
"\\server\share\bginfo\bginfo.exe" "\\server\share\bginfo\user.bgi" /timer:0 /silent
4. Батник запихнуть в групповые политики в логон скрипт.
(или еще http://agorbunov.blogspot.com/2011/09/bginfo.html )

P.S. Спасибо М.Руссиновичу еще раз
Автор: Ugly_Elvis
Дата сообщения: 27.04.2012 13:54
Ну про Bginfo я знаю, разумеется. Не подходит - не любит смену обоев в Windows 7, да и работа в терминальном режиме... кхе-кхе... bmp он и есть bmp. Собственно почему и спросил про скриптик, сам не силён в этом деле, а долго разбираться времени нет.
Автор: jeykey
Дата сообщения: 27.04.2012 19:36
Ugly_Elvis
Как-то так:

Код:
Const MY_COMPUTER = &H11&
Set objNetwork = CreateObject("Wscript.Network")
objComputerName = objNetwork.ComputerName
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(MY_COMPUTER)
Set objFolderItem = objFolder.Self

Function IPAddr()
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _
"SELECT * FROM Win32_NetworkAdapterConfiguration")
For Each objItem in colItems
If Not IsNull(objItem.IPAddress) Then
For Each i in objItem.IPAddress
IPAddr = IPAddr & i
Next
End If
Next
End Function

objFolderItem.Name = "Мой компьютер " & vbCrLf &_
"(" & objComputerName & "\" & vbCrLf &_
                     IPAddr & ")"
Автор: Ugly_Elvis
Дата сообщения: 28.04.2012 10:42
jeykey
Огромное спасибо, бро!
Автор: Igorr
Дата сообщения: 31.05.2012 18:09
Помогите, пожалуйста, разобраться с такой проблемой: надо написать скрипт, который поднимет родной FTP сервис в WinXP (русская), т.е.:
1) установит необходимые компонеты системы для этого сервиса (т.е. попросит диск WinXP, если необходимых компонент еще нет в системе; это скорее всего IIS Manager, Common Files и FTP сервис);
2) запустит FTP сервис и сделает его автоматически запускаемым;
3) внесет FTP сервис в исключения во встроенный firewall;
4) запустит IIS Manager (лучше без показа его окна) и попросит ввести параметры для настройки FTP сайта, т.е.:
а) создаст аккаунт на введенные "имя" и "пароль"
б) попросит выбрать каталог на компе для этого аккаунта
в) попросит определить права чтения/записи
г) может еще чего надо
Как это все делается, каким инструментарием?
Автор: dalight
Дата сообщения: 08.06.2012 15:07
Доброго времени суток всем.
Подскажите, необходимо решить довольно тривиальную задачу. Каждому пользователю в AD необходимо задать e-mail, вида username@domain.ru. В виду отсутствия необходимого опыта застрял. На ум приходит что-то типо:

Код:
Const ADS_PROPERTY_UPDATE = 2
Set objUser = GetObject _
("LDAP://cn=it,ou=Net_Users,dc=domain,dc=ru")
objUser.Put "mail", "it@domain.ru"
objUser.SetInfo
Автор: YNY
Дата сообщения: 10.06.2012 09:15
dalight

Цитата:
Хотелось бы сразу скормить список

попробуй [more=так:]
const ADS_SCOPE_SUBTREE = 2 ' или 0 если не интересны вложенные ОУ

Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
'7
Set objCOmmand.ActiveConnection = objConnection

objCommand.CommandText = _
"Select * from 'LDAP://DC=DOMAIN,DC=local' " _
& "Where objectClass='User' and objectCategory='person'"

'objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
Set rs = objCommand.Execute
rs.MoveFirst
'18

Do Until rs.EOF

'msgbox ChkLAcc(rs.Fields(0).Value)
'тока для не встроенных и (вроде) не локальных

if Not ChkLAcc(rs.Fields(0).Value) then
    Set objUser1 = GetObject(rs.Fields(0).Value)
'objUser1.Get("sAMAccountName") - выдает логин юзера
'objUser1.Get("userPrincipalName") - выдает "логин юзера@полное имя домена"
'objUser1.Get("Name") - выдает имя юзера из описания

    objUser1.Put "mail", "it@domain.ru"
objUser1.SetInfo
    Set objUser1= Nothing
end if
rs.MoveNext
Loop

'чекаем локальные и встроенные аккаунты
Function ChkLAcc(FDQNAccName)
const LAC0="IUSR_"
const LAC1="IWAM_"
const LAC2="SUPPORT_"
const LAC3="krbtgt"
on error resume next
ChkLAcc=False
Set objUser = GetObject(FDQNAccName)

if IsNull(objUser.Get("Description")) then exit function
    if instr(objUser.Get("Description"),"Встроенная")_
OR instr(objUser.Get("Name"),LAC0)_
OR instr(objUser.Get("Name"),LAC1)_
OR instr(objUser.Get("Name"),LAC2)_
OR instr(objUser.Get("Name"),LAC3) then
         ChkLAcc=true
        Set objUser = Nothing
        exit function
end if
End Function
[/more]
Автор: dalight
Дата сообщения: 13.06.2012 15:06
YNY
Спасибо, что откликнулся.
А ты можешь подробнее написать, что происходит при выполнении скрипта.
Просто я написал совсем простенькое, а у тебя никак разобраться не могу. Опиши логику скрипта.
Автор: YNY
Дата сообщения: 14.06.2012 17:25
dalight

Цитата:
Опиши логику скрипта

)))))))))))), ну ты отжег!!! Запусти и поматри результат!
'чекаем локальные и встроенные аккаунты - проверка профиля юзера:
if Not ChkLAcc(rs.Fields(0).Value) then - локальные и встраиваемые отбрасываем.

objUser1.Put "mail", "it@domain.ru" - запись нуного значения, причем, если те нуна

реальный юзер@реальный домен, то
юзай
objUser1.Put "mail", objUser1.Get("userPrincipalName")

В общих чертах: формируется и выполняется запрос в AD, возвращающий набор записей Set rs = objCommand.Execute, потом он анализируется и, в процессе движения по набору записей, уже в конкретные места в AD, вносятся изменения!

Если хочешь узнать когда скрипт все выполнит, после Loop вставь msgbox "Done!"
Автор: Vadimsoul
Дата сообщения: 18.06.2012 19:04
Подскажите плиз, скрипт или политику в active directory..
Нужно чтоб поле "описание" на локальном компьютере и поле "описание" в свойствах компьютеров в active directory синхронизировалось..
Тоесть при каждом изменение в локальном компьютере , переписывалось в active directory .
Автор: wwladimir
Дата сообщения: 19.06.2012 07:30
Vadimsoul
использую несколько лет
Код:
' NAME: Login.vbs
' AUTHOR: Max
' DATE : 16.04.2007
Автор: Vadimsoul
Дата сообщения: 19.06.2012 10:43
wwladimir
а как тогда создать условие: если меняется "описание" на компе то он переписывает его в ad , и наоборот.
Тоесть везде вносились новые изменения, не зависимо где они внесены, в ad или на компе.


Добавлено:
[more] Так же вопрос, что я должен изменить в первой части этого скрипта, чтоб он просто у меня заработал:Dim WshNetwork, dn, UserName, strComputer, colItems, objUser
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
' берем имя компа и пользователя раб станции
Set WshNetwork = WScript.CreateObject ("WScript.Network")
strComputer = WshNetwork.ComputerName
UserName = WshNetwork.UserName
' вытаскиваем distinguishedName пользователя
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\directory\LDAP")
Set colItems = objWMIService.ExecQuery("SELECT * FROM ads_user WHERE DS_sAMAccountName='" & UserName & "'", "WQL", _
wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each objItem In colItems
FullName = objItem.DS_Name
dn = objItem.DS_distinguishedName
Next
' подключаемся к АД и вносим имя компа в поле userWorkstations пользователя
Set objUser = GetObject ("LDAP://OU=company,OU=Users,OU=ttt,dc=domein,dc=ru")
objUser.Put "wWWHomePage",strComputer
objUser.SetInfo
'Прописываем пользователя в описание локальной машины
k = 34 ' ASCII-код кавычек
kk = Chr(k) ' преобразуем в символ для корректного применения в строке
Set WshShell = WScript.CreateObject ("WScript.Shell")
Set net = WshShell.Exec ("net config server /srvcomment:" & kk & FullName & kk)

Права учетке выдал, скрипт выполняется . в userWorkstations ничего не записывает.
При это в локальном описании все появляется. [/more]
Автор: wwladimir
Дата сообщения: 19.06.2012 14:10
VadimsoulХоть в цикл, если нагрузка не важна (мне нравится

Код: @ping localhost -w 1000 -n 30 > nul
rem пауза 300=5 минут
Автор: Vadimsoul
Дата сообщения: 19.06.2012 16:12
Я имел ввиду немного другое, я буду запускать через доменную политику...

Мне не понятно как сделать так, чтоб например часть информации в описании будет заполнятся с компьютеров, а часть из остнастки ad, при этом иногда будет менятся "описание" тоже или локально или в ad.
Как сделать чтоб скрипт перезаписывал более новое описание, не зависимо где его заполнили.

К примеру я туда буду писать номер комнаты, специалист из техподдержки после переезда компьютера сам прописал туда новый номер комнаты, и он появился в ad, ну и наборот я прописал номер комнаты и он появился в описании на локальном компе.

Исходя из этого скрипта просто получится , что он будет переписывать то что записано в ad.
Автор: wwladimir
Дата сообщения: 19.06.2012 16:33
Vadimsoul
1. Так-сначала сформулируйте себе четко- чего хотим. Откуда-куда и с какими "накладными расходами" (ну поставьте в планировщик gpupdate /force раз в минуту, раз периодичности применения GPO недостаточно, хотя и там такой параметр настраивается...),
(куда ваш специалист будет номер комнаты писать- в описание компа ???, а куда номер комнаты должен попадать, а который Вы записали куда - откуда), насколько критична актуальность этой информации ? Ежесекундно или достаточно каждый логон.

2. Пример, который я показал и использую (спасибо автору ) делает очень простую вещь- пишет имя залогинившегося юзера (беря его из AD) в описание копа и в оснастку AD и имя компа в поле юзера в ADUS , только для моего личного удобства.
А дальше уж "напильником" pls.

Автор: Vadimsoul
Дата сообщения: 19.06.2012 17:15
wwladimir
Из Вашего примера получается , что скрипт просто перезаписывает данные постоянно, тоесть если я ввиду правильные данные в active directory, то скрипт их просто перезапишет старыми данными с компьютера.
Вот как исключить эту перезапись?

По поводу скорости обновления, будет достаточно даже раз в неделю.

Процесс в моем случае должен идти следующем образом.

Появляется компьютер, его настраивает хелп деск, пишет в описание номер комнаты.
Компьютер перезжает, хелп деск переписывает описание , в ад он автоматом меняется.
Компьютер опять перезжает, хелп деск забыл прописать номер комнаты, приходит ко мне и просит поменять поле описание, я его меняю и оно АВТОМАТИЧЕСКИ меняется в обоих полях на новое.
Автор: wwladimir
Дата сообщения: 19.06.2012 20:26
Vadimsoul
Ну в заголовке скрипта же написано "логон"!!!
Запускается как груп полиси обжект -из раздела "конфиг. пользователя"..."сценарии"-"вход в систему" .
Работает от имени того (залогинившегося) юзера, потому и права нужны...
Соответственно, срабатывает с периодичностью входа пользователя на данную машину...

В описании чего (делегируйте хелпдеску те пункты, что я показал на ADUC , пусть руками пишут в кастом консоли, да и кадровикам в их части) они пишут ???

Откройте по правой кнопки на своей машине (если у админа XP, а нет- тогда из 7 в XP-mode) -управление компом- подключиться (выбирайте нужную машину)- после подключения по
вершине дерева снова правой, и там свойства - и пишите не вставая со стула в описание, что хотите. Ленивый я...

Подкину идею.
Если у вас современное сетевое оборудование (а раз есть целый хелпдеск, то наверно так...), то физическое положение данной рабочей станции (room) можно однозначно получить из таблицы MAC-адрес=порт свича. И даже софт готовый существует для рисования сети.
Автор: Leon1978
Дата сообщения: 21.06.2012 15:04
кто может поделиться скриптом для exchange 2010 для удаления логов, проверенным временем?
Автор: Sta2s
Дата сообщения: 03.09.2012 12:10
Многоуважаемые коллеги!
Пишу сценарий на jscript с использованием WMI. Столкнулся с проблемой локализации WIN.
Часть значений возвращаются локализованными, даже если принудительно указывать об обратном.
Например:
[more]
var     locator = new ActiveXObject("WbemScripting.SWbemLocator"),
    connection = locator.connectServer('.','root\\cimv2',undefined,undefined,"MS_409"),
    wbem = GetObject("winmgmts:[locale=ms_409]!root/cimv2")
    
wmi(connection)
wmi(wbem)

function wmi(connection)
{
    var
        sql = 'SELECT Version FROM Win32_Processor',
        resp = connection.ExecQuery(sql,"WQL",48+131072),
        rs = new Enumerator(resp),
        res = []
    for (;!rs.atEnd();rs.moveNext())
    {
        rs_ = new Enumerator(rs.item().Properties_)
        for ( ; !rs_.atEnd(); rs_.moveNext() )
        {
            res.push(rs_.item().Name+":"+rs_.item().Value)
        }
    }
    WScript.echo(res.join('\n'))
}
[/more]

Вопрос: как сделать запрос к WMI, чтобы получить ответ на определённом языке?

При запуске с установленным английским языком в пользователе "Default User" возвращает значение Version на английском(как и положено), в ином случае(и на русской версии windows) возвращает значение Version на русском вне зависимости от указанной в запросе локали (ms_409 = en_US)
для русского ms_419 ситуация аналогична при установленном английском по умолчанию - значения - только на английском.

p.s.: переписал сценарий для SWbemLocator и GetObject - результат одинаковый, всё равно используется только одна локаль.
Автор: YNY
Дата сообщения: 03.09.2012 16:17
Sta2s
по тестируй [more=вот этот]
Const intMin = 3600
strComputer = "RemoteComputer"
strDomain = "DomainName"
Wscript.StdOut.Write "Please enter your user name:"
strUser = Wscript.StdIn.ReadLine
Set objPassword = CreateObject("ScriptPW.Password")
Wscript.StdOut.Write "Please enter your password:"
strPassword = objPassword.GetPassword()
Wscript.Echo

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objSWbemLocator.ConnectServer(strComputer, _
"root\CIMV2", _
strUser, _
strPassword, _
"MS_409", _
"NTLMDomain:" + strDomain)
Set colItems = objWMIService.ExecQuery( _
"SELECT * FROM Win32_IP4RouteTable",,48)
For Each objItem in colItems
WScript.Echo "Age in Minutes: " _
& int(objItem.Age/intMin) & VBNewLine _
& "Description: " & objItem.Description & VBNewLine _
& "Destination: " & objItem.Destination & VBNewLine _
& "InterfaceIndex: " & objItem.InterfaceIndex & VBNewLine _
& "Mask: " & objItem.Mask & VBNewLine _
& "Metric1: " & objItem.Metric1 & VBNewLine _
& "Metric2: " & objItem.Metric2 & VBNewLine _
& "Metric3: " & objItem.Metric3 & VBNewLine _
& "Metric4: " & objItem.Metric4 & VBNewLine _
& "Metric5: " & objItem.Metric5 & VBNewLine _
& "Name: " & objItem.Name & VBNewLine _
& "NextHop: " & objItem.NextHop & VBNewLine _
& "Protocol: " & objItem.Protocol & VBNewLine _
& "Type: " & objItem.Type
WScript.Echo
Next
[/more] пример, может ты не верно передаешь строку или хз)
Автор: Sta2s
Дата сообщения: 03.09.2012 23:54
YNY, ваш пример прекрасно работает, но в нём - только цифры, там нечему быть локализованным.
Я уточню свой сценарий:
[more]var    locator = new ActiveXObject("WbemScripting.SWbemLocator"),
    connection = locator.connectServer('.','root\\cimv2',undefined,undefined,"ms_409"),
    connection1 = locator.connectServer('.','root\\cimv2',undefined,undefined,"ms_419"),
    wbem = GetObject("winmgmts:[locale=ms_409]!root/cimv2"),
    wbem1 = GetObject("winmgmts:[locale=ms_419]!root/cimv2")
    
wmi(connection)
wmi(connection1)
wmi(wbem)
wmi(wbem1)

function wmi(connection)
{
    var    selection = 'Version'
        sql = 'SELECT '+selection+' FROM Win32_Processor',
        wbemFlagUseAmendedQualifiers = 131072,
        resp = connection.ExecQuery(sql,"WQL",wbemFlagUseAmendedQualifiers),
        rs = new Enumerator(resp),
        res = []

    for (;!rs.atEnd();rs.moveNext())
    {
        rs_ = new Enumerator(rs.item().Properties_)
        for ( ; !rs_.atEnd(); rs_.moveNext() )
        {
            if (rs_.item().Name==selection) res.push(rs_.item().Name+":"+rs_.item().Value)
        }
    }
    WScript.echo(res.join('\n'))
}
[/more]
согласно:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa393720%28v=vs.85%29.aspx
и
http://nukz.net/reference/wmi/hh/wmisdk/localization_8dm1.htm
должно возвращать значения на разных языках (wbemFlagUseAmendedQualifiers)

как выяснилось всем управляет параметр локали в "язык и региональные стандарты"
[more]

после установки локали поставить птицу внизу сл. скриншота

[/more]
однако если запустить сценарий в ХР при установленном английском в профиль Default User получается:

Код: Version:Model 7, Stepping 6
Version:Model 7, Stepping 6
Version:Model 7, Stepping 6
Version:Model 7, Stepping 6
Автор: YNY
Дата сообщения: 04.09.2012 07:14
Sta2s
я думаю, что если скрипт запускается локально ('.'), то и значения он выдает в зависимости от того какая локаль на конкретной машине, если ты будешь подкл к удаленной машине через скрипт, то только в этом случае тебе может прийти значение в твоей локале!
__________
рс: юзай тег "[more]" дабы скрыть свой пример кода и чтоб было проще читать)
Автор: Sta2s
Дата сообщения: 04.09.2012 09:42
YNY, к сожалению тоже не подтверждается практикой
машина с английской локалью отдаёт всё и везде по английски(как в локальные запросы так и запросы с других машин отдаёт в ms_409) и аналогично для русской локали
проверил во всех конфигурациях с методом connectServer
en->ru=en
en->en=en
ru->en=ru
ru->ru=ru
вне зависимости от установленного параметра strLocale и флага wbemFlagUseAmendedQualifiers ответ приходит в локали wmi-сервера вне зависимости от локали на клиентской машине(там где выполняется скрипт)
причём дело даже не в MUI или уже скомпилированных mof файлах, я пробовал запустить скрипт на чистой ENU OEM XP - всё равно если запрос делается с машины на которой установлена русская локаль - ответ приходит по русски

к сожалению с GetObject проверить нет возможности
Автор: YNY
Дата сообщения: 04.09.2012 11:40
Sta2s
ну поиски "почему не работает" могут затянуться на долго, быстрей будет разбить строку по "," затем выделить только цифры)
Посмотри http://msdn.microsoft.com/en-us/library/windows/desktop/aa392276(v=vs.85).aspx

Страницы: 1234567891011

Предыдущая тема: Не Работает сканер по сети HP 3055


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.