Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Windows > Полезные скрипты |
Автор: AlexLine 14.03.07, 22:13 |
Предлагаю сюда складывать полезные скрипты, реализованные с применением вышенаписанных в описании темы технологий.. что есть полезные, ну например: Скрипт меняющий пароль локального админа на всех компьютерах домена Скрипт добаляющий определенного пользоватея в локальную группу безопасности на всех машинах домена Скрипт отображающий в параметре Comp_Display_Name FullName залогиненого на машину пользователя итд... применяем WMI при необходимости в своих решениях. Итак, начинаю первый... Скрипт меняющий пароль локального админа на всех компьютерах домена: этот скрипт нужно засунуть в стартап скрипты в ГП для компа, предварительно ессесено сздать саму ГП и применить ее для всех компьютеров домена. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> strComputer = "." Set objUser = GetObject("WinNT://" & strComputer & "/Администратор,user") objUser.SetPassword "krut'nesusvetnaya" objUser.SetInfo а этот скрипт нужно просто запустить на контроллере домена, он поменяет пароль на всех компах - членах домена (ессесено на тех что будут в онлайне) тока один минус - он долго обрабатывается, ибо он пытается поменять пароль даже если тачка в оффлайне, есесено не получив ответа отваливается по таймауту. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Set WshShell = WScript.CreateObject("WScript.Shell") Set FileSys = CreateObject("Scripting.FileSystemObject") Set FileTxt = FileSys.OpenTextFile("c:\psw_local_adm.log", 8, TRUE) Set colComputers = GetObject("WinNT://company.ru") colComputers.Filter = Array("computer") On Error Resume Next For Each objComputer In colComputers strComputer = objComputer.Name If Not strComputer = "SERVANT" Then Set objUser = GetObject("WinNT://" & strComputer & "/Administrator,user") objUser.SetPassword "123456" objUser.SetInfo If Err.Number =0 Then FileTxt.WriteLine strComputer & " - password changed" Else FileTxt.WriteLine strComputer & " - computer is offline or error occured" End If End If Next FileTxt.Close intReturn = WshShell. Run("notepad.exe c:\psw_local_adm.log", 4, false) Это сообщение было перенесено сюда или объединено из темы "Полезные скрипты" |
Автор: B.V. 14.03.07, 23:58 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '/********************************************************************/ '/* Имя: ListProcesses.vbs */ '/* Язык: VBScript */ '/* Описание: Вывод на экран списка всех запущенных на локальной */ '/* рабочей станции процессов */ '/********************************************************************/ Dim WMI ' //Экземпляр WMI Dim Process ' //Экземпляр коллекции dim SQuery Dim SList ' //Строка для вывода на экран dim WShell ' Dim Processes 'Коллекция процессов Dim ListFile 'имя файла вывода Dim FSO 'объект файловой системы Dim sOwnerUser, sOwnerDomain Dim Ret ' //Соединяемся с WMI Set FSO=CreateObject("Scripting.FileSystemObject") Set WShell=CreateObject("Wscript.Shell") set WMI=GetObject("winMgmts:") 'Формируем текст запроса SQuery="SELECT * FROM Win32_Process WHERE Name<>'EXPLORER.EXE'" 'Создаем коллекцию-результат запроса set Processes=WMI.ExecQuery(SQuery) 'Цикл по всем элементам коллекции for each Process in Processes ' //Формируем строку с именами процессов SList=SList & "Имя процесса: " & Process.Name & vbcrlf '// Отобразим хендл процесса SList=SList & "Хендл процесса: " & Process.Handle & vbcrlf 'Получим PID процесса (по нему мы ниже сможем через Shell.AppActivate 'управлять приложением через SendKeys SList=SList & "Process ID (PID): " & Process.ProcessId & vbcrlf 'Получим полный путь к исполняемому файлу SList = SList & "ExecutablePath: " & Process.ExecutablePath & vbcrlf 'Получим имя пользователя от которого запущен процесс Process.GetOwner sOwnerUser,sOwnerDomain SList=SList & "Запущено от имени: " & sOwnerDomain & "\" & sOwnerUser & vbcrlf SList=SList & "- - - - - - - - - - - -" & vbcrlf 'Следующие строки показывают - имеет ли процесс хоть одно видимое окно ' WShell.popup "Попытка активировать приложение " & vbcrlf & _ ' Process.name & vbcrlf & _ ' "(" & Process.executablepath & ")", 2 'Если процесс имеет видимое окно - то Ret после вызова нижележащей строки 'получит значение больше нуля. Если меньше нуля - значит процесс или не имеет окон 'или все окна у него невидимы ret = WShell.AppActivate (Process.processid) 'сделаем небольшую паузу, чтобы приложение успело активироваться. If Ret> 0 Then WScript.Sleep 1000 ' WShell.Popup "Удачная попытка активации " & Process.name, 3 'Else ' WShell.Popup "Неудачная попытка активации " & Process.name, 5 End If Next '//Выводим информацию на экран 'MsgBox SList,,"Список запущенных процессов." '// или выводим информацию в файл Set ListFile=FSO.CreateTextFile("C:\ListProcess.txt") ListFile.write(SList) ListFile.close Set ListFile=Nothing Set FSO=Nothing Set WMI=nothing WScript.Quit '/************* Конец *********************************************/ Это сообщение было перенесено сюда или объединено из темы "Полезные скрипты" |
Автор: AlexJ 15.03.07, 02:58 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '************************************************************************ '* Имя: Change_IP_mask_DNS_Gate_by_MAC.vbs * '* Язык: VBScript * '* Назначение: Изменить static-IP, Mask, DNS, Gateway для определенного * '* сетевого адаптера по MAC-адресу * '************************************************************************ strComputer = "." ' "."-локальный комп или можно имя удаленного компа Set objWMIService = GetObject( _ "winmgmts:\\" & strComputer & "\root\cimv2") Set colNetAdapters = objWMIService.ExecQuery _ ("Select * from Win32_NetworkAdapterConfiguration " _ & "where IPEnabled=TRUE") strIPAddress = Array("192.168.1.180") ' Новый IP strSubnetMask = Array("255.255.255.0") ' Новая маска подсети strGateway = Array("192.168.1.15") ' Новый шлюз strDNSserver = Array("192.168.1.15") ' Новый DNS-server strMACadapter = "00:12:23:45:67:89" ' MAC-address сетевого адаптера для ' которого устанавливаем новые значения strGatewayMetric = Array(1) For Each objNetAdapter in colNetAdapters If objNetAdapter.MACAddress = strMACadapter then errEnable = objNetAdapter.EnableStatic( _ strIPAddress, strSubnetMask) errGateways = objNetAdapter.SetGateways(_ strGateway, strGatewaymetric) errDNS = objNetAdapter.SetDNSServerSearchOrder(strDNSServer) end if Next Это сообщение было перенесено сюда или объединено из темы "Полезные скрипты" |
Автор: Arny 15.03.07, 05:05 |
AlexLine, я бы сделал дополнение к твоему первому скриптику вот такое: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> strComputer = "." Set objUser = GetObject("WinNT://" & strComputer & "/Administrator,user") objUser.SetPassword "vashe_krutoy_pass" objUser.SetInfo ибо не у всех русский админ на тачках. Это сообщение было перенесено сюда или объединено из темы "Полезные скрипты" |
Автор: Dmitrii 15.03.07, 06:42 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '****************************************************************** '* Имя: Account_Status.vbs * '* Язык: VBScript * '* Назначение: Определение состояния (вкл.|выкл.) учётных записей * '* пользователей домена для заданных групп * '****************************************************************** 'Предполагается, что в структуре AD существуют объекты типа "ПОДРАЗДЕЛЕНИЕ" 'первого уровня вложенности (в примере - значения массива grpNames), 'в каждый из которых вложен одноимённый объект типа "ГРУППА БЕЗОПАСНОСТИ". Const ForWriting = 2 grpNames = Array("Бухгалтерия", "Менеджеры", "Склад") Set fsObj = CreateObject("Scripting.FileSystemObject") Set myFile = fsObj.OpenTextFile("c:\stat_file.txt", ForWriting, True) For i = LBound(grpNames) To UBound(grpNames) curGroup = grpNames(i) Set objGroup = GetObject("LDAP://cn=" & curGroup & ",ou=" & curGroup & ",dc=domain_name,dc=ru") For Each curUser In objGroup.Members xName = Mid(curUser.Name, 4) If curUser.AccountDisabled Then xStatus = "Отключена" Else xStatus = "Включена" End If myFile.WriteLine(curGroup & "," & xName & "," & xStatus) Next Next myFile.Close Set myFile = Nothing Set objGroup = Nothing Set fsObj = Nothing <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '***************************************************************** '* Имя: UserAccount_OnOff.vbs * '* Язык: VBScript * '* Назначение: Управление состоянием (вкл.|выкл.) учётной записи * '* заданного пользователя домена * '***************************************************************** 'Предполагается, что в структуре AD существуют объект типа "ПОДРАЗДЕЛЕНИЕ" 'первого уровня вложенности (в примере - "Склад"), в который вложен 'однотипный объект (в примере - "Пользователи"). 'В подразделение "Пользователи" вложен объект типа "ПОЛЬЗОВАТЕЛЬ" '(в примере - значение константы usrName). Const usrName = "Кладовщик" Const usrLocate = ",ou=Пользователи,ou=Склад" Set objUser = GetObject("LDAP://cn=" & usrName & usrLocate & ",dc=domain_name,dc=ru") Set scrShell = CreateObject("WScript.Shell") curStatus = objUser.AccountDisabled If CBool(curStatus) Then sQuest = " отключена." & vbCr & "Включить?" sRes = " включена." Else sQuest = " включена." & vbCr & "Отключить?" sRes = " отключена." End If selAction = scrShell.Popup("Сейчас учётная запись пользователя " & UCase(usrName) & sQuest, , _ "Выбор действия", vbQuestion + vbYesNo) If selAction = vbYes Then objUser.AccountDisabled = Not CBool(curStatus) objUser.SetInfo WScript.Echo "Учётная запись пользователя " & UCase(usrName) & sRes End If Set scrShell = Nothing Set objUser = Nothing Это сообщение было перенесено сюда или объединено из темы "Полезные скрипты" |
Автор: Rust 15.03.07, 07:08 |
Цитата AlexLine @ Коллеги, призываю вас использовать теги [code] в соответствии тому языку, на котором написан публикуемый скрипт Просто если использовать тег VB вместо VB Script код становится намного читабельней. Добавлено Это сообщение было перенесено сюда или объединено из темы "Полезные скрипты" |
Автор: Dmitrii 15.03.07, 08:22 |
Пожалуй, так. Впрочем, лично для меня большой разницы нет. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '************************************************************************* '* Имя: Details_About_File.vbs * '* Язык: VBScript * '* Назначение: Получение расширенного списка свойств для заданного файла * '************************************************************************* Dim propNames(37), propValues(37) nameFolder = "C:\WINNT" nameItem = "clock.avi" Set objShell = CreateObject("Shell.Application") Set objFolder = objShell.Namespace(nameFolder) Set objItem = objFolder.Items.Item(nameItem) lstProperties = vbNullString For i = LBound(propNames) to UBound(propNames) propNames(i) = objFolder.GetDetailsOf(objFolder.Items, i) propValues(i) = objFolder.GetDetailsOf (objItem, i) lstProperties = lstProperties & i & ": " & propNames(i) & " = " & propValues(i) & vbCr Next WScript.Echo lstProperties <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '************************************************************ '* Имя: Shortcut_Create.vbs * '* Язык: VBScript * '* Назначение: Создание и настройка ярлыка на рабочем столе * '************************************************************ Set objShell = CreateObject("Shell.Application") Set objDesktop = objShell.NameSpace(&H0) desktopDir = objDesktop.Self.Path & "\" Set objDesktop = Nothing Set objShell = Nothing Set objWShell = CreateObject("WScript.Shell") Set objSC = objWShell.CreateShortcut(desktopDir & "ДубльГИС, Новосибирск.lnk") objSC.Description = "План города" objSC.IconLocation = "shell32.dll, 13" objSC.TargetPath = "C:\Program Files\2gis\Nsk\grym.exe" objSC.WindowStyle = 1 objSC.WorkingDirectory = "C:\Program Files\2gis\Nsk" objSC.Save Set objSC = Nothing Set objWShell = Nothing <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '********************************************************** '* Имя: Shortcut_Targets.vbs * '* Язык: VBScript * '* Назначение: Определение объектов, на которые ссылаются * '* ярлыки рабочего стола * '********************************************************** Set objShell = CreateObject("Shell.Application") Set objDeskTop = objShell.NameSpace(&H0) lstTargets = vbNullString i = 1 For Each curObj In objDeskTop.Items If curObj.IsLink Then Set objSC = curObj.GetLink lstTargets = lstTargets & i & ": " & curObj.Name & vbCr & vbTab & objSC.Path & vbCr i = i + 1 End If Next WScript.Echo lstTargets Это сообщение было перенесено сюда или объединено из темы "Полезные скрипты" |
Автор: P.O.D 15.03.07, 15:55 |
Цитата AlexJ @ '* Назначение: Изменить static-IP, Mask, DNS, Gateway для определенного * '* сетевого адаптера по MAC-адресу * интересно, это что любому юзеру в сети удаленно можно поменять? Это баг или нужен логин/пароль ? Это сообщение было перенесено сюда или объединено из темы "Полезные скрипты" |
Автор: AlexLine 15.03.07, 16:01 |
Цитата P.O.D @ интересно, это что любому юзеру в сети удаленно можно поменять? Это баг или нужен логин/пароль ? Нет, только имея достаточные права в системе, не забывай, чтьо если скрипт запущен без доп параметров, то он запускается от имени текущего пользователя. Это сообщение было перенесено сюда или объединено из темы "Полезные скрипты" |
Автор: AlexJ 15.03.07, 19:18 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '************************************************************************* '* Имя: SetManualSystemRestorePoint.vbs * '* Язык: VBScript * '* Назначение: Ручная установка новой точки отката системы * '************************************************************************* strComp="." Set sr = getobject("winmgmts:\\" & strComp & "\root\default:Systemrestore") Set WshShell = WScript.CreateObject("WScript.Shell") If ( sr.createrestorepoint( "Manual Restore Point", 0, 100 ) ) = 0 Then msg = "New Restore Point successfully created." & vbCrLf & vbCrLf msg = msg & "It is listed as: " & Time & " Manual Restore Point" WshShell.PopUp msg, 3, "Manual Restore Point", vbOKOnly Else MsgBox "Restore Point creation Failed!", vbOKOnly, "Manual Restore Point" End If Это сообщение было перенесено сюда или объединено из темы "Полезные скрипты" |
Автор: AlexJ 15.03.07, 20:31 |
C vba-тегом читается значительно понятней (at least видны коментарии) <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '************************************************************************* '* Имя: SetAllNetworkAdapters2DHCP.vbs * '* Язык: VBScript * '* Назначение: Установить на всех сетевых адаптерах сетевую конфигурацию * '* через DHCP * '************************************************************************* strComputer = "." Set objWMIService = GetObject(_ "winmgmts:\\" & strComputer & "\root\cimv2") Set colNetAdapters = objWMIService.ExecQuery _ ("Select * from Win32_NetworkAdapterConfiguration " _ & "where IPEnabled=TRUE") For Each objNetAdapter In colNetAdapters errEnable = objNetAdapter.EnableDHCP() Next <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '************************************************************************* '* Имя: GetIPaddressOfParticularConnection.vbs * '* Язык: VBScript * '* Назначение: Получить IP-адрес для определённого сетевого соединения * '************************************************************************* strComputer = "." strNetworkConnection = "'Local Area Connection'" ' <- редактировать под нужное ' имя сетевого конекта Set objWMIService = GetObject( _ "winmgmts:\\" & strComputer & "\root\cimv2") Set colNics = objWMIService.ExecQuery _ ("Select * From Win32_NetworkAdapter " _ & "Where NetConnectionID = " & strNetworkConnection) For Each objNic in colNics Set colNicConfigs = objWMIService.ExecQuery _ ("ASSOCIATORS OF " _ & "{Win32_NetworkAdapter.DeviceID='" & _ objNic.DeviceID & "'}" & _ " WHERE AssocClass=Win32_NetworkAdapterSetting") For Each objNicConfig In colNicConfigs For Each strIPAddress in objNicConfig.IPAddress Wscript.Echo "IP Address: " & strIPAddress Next Next Next Это сообщение было перенесено сюда или объединено из темы "Полезные скрипты" |
Автор: AlexJ 15.03.07, 21:59 |
У меня есть еще дополнение, нельзя ли сделать в этой ветке для скриптов под-темы и разбить их по назначению (ну к примеру как на мелкософте) Accounts and Domains Computer Hardware Computer Software Dates and Times Desktop Management Disks and File Systems Event Logs Files and Folders Networking Operating Systems Performance Monitoring Processes Printers and Printing Manage Registry Scheduled Tasks Services иначе среди сплошной простыни перемешенного по назначению кода фиг что найдешь если понадобиться. Ну или хотя бы давайте в заголовках писать к какому разделу будет относиться скрипт. Это сообщение было перенесено сюда или объединено из темы "Полезные скрипты" |
Автор: AlexLine 15.03.07, 22:23 |
Цитата AlexJ @ У меня есть еще дополнение, нельзя ли сделать в этой ветке для скриптов под-темы и разбить их по назначению (ну к примеру как на мелкософте) поддерживаю, сам об этом думал! так и сделаем, как хотя бы скриптов 30 наберем общих Это сообщение было перенесено сюда или объединено из темы "Полезные скрипты" |
Автор: Dmitrii 16.03.07, 05:39 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '************************************************************* '* Имя: CopyFolder_with_Progress.vbs * '* Язык: VBScript * '* Назначение: Копирование каталога с отображением * '* индикатора процесса. * '* Сценарий предназначен для работы в режиме GUI * '************************************************************* Const PARAM_DIALOG = 0 Const targetDirSpec = "F:\" Const sourceDirSpec = "C:\BORLANDC" Set objShell = CreateObject("Shell.Application") Set objFolder = objShell.NameSpace(targetDirSpec) objFolder.CopyHere sourceDirSpec, PARAM_DIALOG <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '******************************************************************** '* Имя: TreeView_from_CmdLine.vbs * '* Язык: VBScript * '* Назначение: Составление списка содержимого дерева катлогов * '* с имитацией индикатора процесса. * '* Сценарий предназначен для работы из командной строки * '******************************************************************** Dim objFS, resFile Const resFileSpec = "C:\ListObjects.txt" Const sourceDirSpec = "C:\BORLANDC" Set objFS = CreateObject("Scripting.FileSystemObject") Wscript.Echo "Идёт чтение данных." If objFS.FolderExists(sourceDirSpec) Then Set resFile = objFS.OpenTextFile(resFileSpec, 2, True) Call ViewFolder(sourceDirSpec) resFile.Close Wscript.StdOut.WriteLine WScript.Echo "Готово." Else WScript.Echo "Не найден каталог-источник: " & UCase(sourceDirSpec) End If Set objFS = Nothing '=== Function ViewFolder(dirSource) Dim objFS, pntDir, curSubDir Set objFS = CreateObject("Scripting.FileSystemObject") Set pntDir = objFS.GetFolder(dirSource) Call EnumFiles(dirSource) For Each curSubDir In pntDir.SubFolders Wscript.StdOut.Write(".") Call ViewFolder(dirSource & "\" & curSubDir.Name) Next Set pntDir = Nothing Set objFS = Nothing End Function '=== Function EnumFiles(dirSource) Dim objFS, pntDir, curFile Set objFS = CreateObject("Scripting.FileSystemObject") Set pntDir = objFS.GetFolder(dirSource) For Each curFile In pntDir.Files resFile.WriteLine (curFile.Path) Wscript.StdOut.Write(".") Next Set pntDir = Nothing Set objFS = Nothing End Function Это сообщение было перенесено сюда или объединено из темы "Полезные скрипты" |
Автор: Rust 16.03.07, 05:56 |
Это сообщение было перенесено сюда или объединено из темы "Полезные скрипты" |
Автор: Dmitrii 16.03.07, 09:33 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '************************************************************** '* Имя: Read_from_Register.vbs * '* Язык: VBScript * '* Назначение: Пример чтения из реестра значений разных типов * '************************************************************** Const compName = "." Const resFileSpec = "C:\ListValues.txt" Const HKey = &H80000001 'HKCU Const keyPath = "SOFTWARE\Microsoft\Office\10.0\Common\LanguageResources" Const ForWriting = 2 Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & compName & "\root\default:StdRegProv") objReg.EnumValues HKey, keyPath, arrNames, arrTypes numValues = UBound(arrNames) Set objFS = CreateObject("Scripting.FileSystemObject") Set resFile = objFS.OpenTextFile(resFileSpec, ForWriting, True) For curVal = 0 To numValues Select Case arrTypes(curVal) Case 1 sTemp = "SZ" & " = " objReg.GetStringValue HKey, keyPath, arrNames(curVal), paramVal sTemp = sTemp & paramVal Case 2 sTemp = "EXPAND_SZ" & " = " objReg.GetExpandedStringValue HKey, keyPath, arrNames(curVal), paramVal sTemp = sTemp & paramVal Case 3 sTemp = "BINARY" & " = " objReg.GetBinaryValue HKey, keyPath, arrNames(curVal), paramVal For i = 0 To UBound(paramVal) xBin = Hex(paramVal(i)) If Len(xBin) = 1 Then xBin = "0" & xBin End If sTemp = sTemp & xBin & " " Next Case 4 sTemp = "DWORD" & " = " objReg.GetDWORDValue HKey, keyPath, arrNames(curVal), paramVal sTemp = sTemp & paramVal Case 7 sTemp = "MULTI_SZ" & " = " objReg.GetMultiStringValue HKey, keyPath, arrNames(curVal), paramVal For i = 0 To UBound(paramVal) sTemp = sTemp & paramVal(i) & " " Next Case Else: sTemp = arrTypes(curVal) End Select resFile.WriteLine (arrNames(curVal) & " >> " & sTemp) Next resFile.Close Set resFile = Nothing Set objFS = Nothing Set objReg = Nothing Это сообщение было перенесено сюда или объединено из темы "Полезные скрипты" |
Автор: Dmitrii 16.03.07, 11:28 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '*************************************************************************** '* Имя: Verb_Print.vbs * '* Язык: VBScript * '* Назначение: Использование стандартного действия ("глагола") над файлом * '* для вывода его на печать без явного открывания в приложении * '*************************************************************************** Const myFileName = "Text.txt" Const pathToFile = "C:\" Const argToVerb = "" Const stdVerb = "print" Const showMode = 0 'работа в скрытом окне Set objApp = CreateObject("Shell.Application") objApp.ShellExecute myFileName, argToVerb, pathToFile, stdVerb, showMode Set objApp = Nothing Это сообщение было перенесено сюда или объединено из темы "Полезные скрипты" |
Автор: AlexLine 16.03.07, 14:19 |
Dmitrii, КРАЙНЕ желательно размещать не просто скрипты, которые публикуются в учебных материалах, для понимания работы, а скрипты иеющие реальное приложение в локальных доменных сетях. Это сообщение было перенесено сюда или объединено из темы "Полезные скрипты" |
Автор: Koss 18.03.07, 17:16 |
Следующий код узнаёт версию файла при помощи GetFileVersion. Цитата Option Explicit Dim fso, oShell ' Object variables Dim file, tmp ' Filename file = "Forumizer_sources_ru_1.409.exe" Set oShell = WScript.CreateObject("WScript.Shell") file = oShell.ExpandEnvironmentStrings(file) ' Create FileSystemObject object to access the file system. Set fso = CreateObject("Scripting.FileSystemObject") ' Check whether file exists. If fso.FileExists(file) Then tmp = fso.GetFileVersion(file) ' Retrieve version. If Len(tmp) > 0 Then WScript.Echo "File " & file & vbCrLf & _ "Version: " & tmp Else WScript.Echo "File " & file & vbCrLf & _ "Version: undefined" End if Else WScript.Echo "File '" & file & "' not found" End If '*** End собственно, а как задавать версию файла этой же функцией ? |
Автор: AlexJ 18.03.07, 23:08 |
Оффициально - никак. Версия файла задается в ресурсах файла, и подключается к ехе-шнику во время компиляции(точнее линковки), а поменять можно (нелегально ) открыв файл и пройдясь по нему в поисках юникодовой строки FileVersion после которой будут юникодовые циферки, в ввиде обыкновенного текста, которые естественно можно подменить. |
Автор: Dmitrii 19.03.07, 11:36 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '************************************************************************************************************ '* Имя: ACL_FSO_Get.vbs * '* Язык: VBScript * '* Назначение: Получение подробного (полного или частичного) списка управления доступом NTFS (DACL) * '* указанного каталога текущего компьютера. * '* Частичный список составляется в том случае, когда задано имя пользователя (группы). * '* Для составления частичного списка необходимо задать только NetBIOS-имя объекта, * '* в противном случае будет создан полный список. * '* Можно указать имя объекта либо доменного, либо локального (для текущего компьютера) уровня. * '* Допустимо указание имён ряда встроенных локальных объектов: "System" (или "Система"), "Все", * '* "Администратор(ы)", "Гост(ь)(и)" и т.п. * '* Имена объектов можно задавать как в кавычках, так и без них. * '* Имя каталога выбирается с помощью метода BrowseForFolder объекта Shell.Application. * '* Сценарий ориентирован на работу в графическом режиме. * '************************************************************************************************************ Option Explicit End Sub Dim objShell, objFolder, strPath Dim objWsNet, strDomain, strComputer, blnIsDomain, intOSVersion Dim objWMI, objCollection, objItem, objSecSettings, objSD Dim strAccount, strSID, strList Dim intHasAccount 'Флаг-признак режима работы: '-1 - не составлять список, т.к. указанная "учётка" не найдена; '0 - составлять полный список; '1 - составлять частичный список (только для указанной "учётки"). Set objShell = CreateObject("Shell.Application") Set objFolder = objShell.BrowseForFolder(0, "Выбор каталога", &H10 + &H200, &H11) If Not objFolder Is Nothing Then strPath = objFolder.Self.Path Set objWsNet = CreateObject("WScript.Network") strDomain = objWsNet.UserDomain strComputer = objWsNet.ComputerName Set objWsNet = Nothing If StrComp(strDomain, strComputer, vbTextCompare) <> 0 Then blnIsDomain = True Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") '--- Определение версии ОС Set objCollection = objWMI.ExecQuery("SELECT Version FROM Win32_OperatingSystem") For Each objItem In objCollection intOSVersion = CInt(Replace(Left(objItem.Version, 3), ".", "")) Next Set objItem = Nothing '------ strAccount = Trim(InputBox("Имя пользователя или группы" & vbNewLine & _ "(при составлении полного списка -" & vbNewLine & _ "не указывать):", "Проверка настроек безопасности NTFS")) intHasAccount = 0 If Len(strAccount) > 0 Then strAccount = Replace(strAccount, """", "") '--- Настройка правильного наименования "учётки" локальной ОС в зависимости от версии ОС If intOSVersion < 61 Then strAccount = Replace(strAccount, "Система", "System", 1, -1, vbTextCompare) Else strAccount = Replace(strAccount, "System", "Система", 1, -1, vbTextCompare) End If '------ If StrComp(strAccount, "System", vbTextCompare) = 0 Or StrComp(strAccount, "Система", vbTextCompare) = 0 Or _ StrComp(strAccount, "Все", vbTextCompare) = 0 Then strDomain = vbNullString Else If blnIsDomain Then If MsgBox("Задана доменная учётная запись?", vbYesNo + vbQuestion, "Проверка настроек безопасности NTFS") = vbNo Then strDomain = strComputer End If Else strDomain = strComputer End If End If '--- Поиск заданной "учётки" на локальном компьютере или в Active Directory If Len(strDomain) > 0 Then Set objCollection = objWMI.ExecQuery("SELECT SID FROM Win32_Account WHERE Domain='" & strDomain & "' AND Name='" & strAccount & "'") Else Set objCollection = objWMI.ExecQuery("SELECT SID FROM Win32_Account WHERE Name='" & strAccount & "'") End If '------ If objCollection.Count > 0 Then intHasAccount = 1 '--- Определение SID заданной "учётки" For Each objItem In objCollection strSID = UCase(objItem.SID) Next '------ Else intHasAccount = -1 End If End If If intHasAccount >= 0 Then Set objSecSettings = objWMI.Get("Win32_LogicalFileSecuritySetting.Path='" & strPath & "'") If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then 'Чтение содержимого дескриптора безопасности каталога strList = vbNullString If Not IsNull(objSD.DACL) Then 'Проверка наличия хотя бы одной записи в DACL каталога Call Get_DACLInfo(objSD.DACL, strList, intHasAccount, strSID, intOSVersion) If Len(strList) > 0 Then WScript.Echo strList Else WScript.Echo "В DACL не обнаружено ни одной записи для объекта " & UCase(strDomain & "\" & strAccount) End If Else WScript.Echo "Список управления доступом к каталогу " & UCase(strPath) & " пуст." End If Else WScript.Echo "Не удалось прочитать дескриптор безопасности каталога " & UCase(strPath) End If Else WScript.Echo "Учётная запись объекта " & UCase(strDomain & "\" & strAccount) & " не найдена." End If Set objSecSettings = Nothing Set objCollection = Nothing Set objWMI = Nothing Else WScript.Echo "Каталог не выбран." End If Set objFolder = Nothing Set objShell = Nothing WScript.Quit 0 '====== Function Get_DACLInfo(arrACE(), strRes, intMode, strAccSID, intVer) Dim objEntry, strTemp, i, j, lngMask, lngTemp Dim arrFlagValue, arrFlagName, arrGenericValue, arrGenericName Dim arrSieveGE, arrSieveGW, arrSieveGR, arrTemp Const PART_MODE = 1 'Флаг-признак составления частичного списка '--- Значения универсальных масок Const GENERIC_ALL = &H10000000 Const GENERIC_EXECUTE = &H20000000 Const GENERIC_WRITE = &H40000000 Const GENERIC_READ = &H80000000 '------ Const ACCESS_ALLOWED_ACE_TYPE = 0 'Флаг-признак записи типа "РАЗРЕШЕНИЕ" Const ACCESS_DENIED_ACE_TYPE = 1 'Флаг-признак записи типа "ЗАПРЕТ" Const INHERITED_ACE = 16 'Флаг-признак того, что текущая запись DACL унаследована от родительского каталога Const FULL_ACCESS = 983551 'Значение маски полного разрешения или запрета Const FLAG_SYNCHRONIZE = 1048576 'Значение флага синхронизации доступа к объекту файловой системы '(в версиях ОС "2000/XP", применим только для записей типа "РАЗРЕШЕНИЕ") arrFlagValue = Array(32, 1, 128, 8, 2, 4, 256, 16, 64, 65536, 131072, 262144, 524288) arrFlagName = Array("Траверс папок / Выполнение файлов", _ "Содержание папки / Чтение данных", _ "Чтение атрибутов", _ "Чтение дополнительных атрибутов", _ "Создание файлов / Запись данных", _ "Создание папок / Дозапись данных", _ "Запись атрибутов", _ "Запись дополнительных атрибутов", _ "Удаление подпапок и файлов", _ "Удаление", _ "Чтение разрешений", _ "Смена разрешений", _ "Смена владельца") arrGenericValue = Array(&H20000000, &H40000000, &H80000000) arrGenericName = Array("Выполнение (универсальная маска)", "Запись (универсальная маска)", "Чтение (универсальная маска)") '--- Вспомогательные массивы, предназначенные для детализации универсальных масок arrSieveGE = Array(-1, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0) arrSieveGW = Array(0, 0, 0, 0, -1, -1, -1, -1, 0, 0, -1, 0, 0) arrSieveGR = Array(0, -1, -1, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0) '------ '--- Настройка правильного наименования одного из флагов маски доступа в зависимости от версии ОС If intVer < 60 Then arrFlagName(0) = "Обзор папок / Выполнение файлов" End If '------ For Each objEntry In arrACE '--- Определение режима наследования записи и области её действия If CBool(objEntry.AceFlags And INHERITED_ACE) Then strTemp = " (унаследовано; " lngTemp = objEntry.AceFlags - INHERITED_ACE Else strTemp = " (не унаследовано; " lngTemp = objEntry.AceFlags End If Select Case lngTemp Case 0: strTemp = strTemp & "действует на: только текущий каталог)" Case 1: strTemp = strTemp & "действует на: текущий каталог и его файлы)" Case 2: strTemp = strTemp & "действует на: текущий каталог и его подкаталоги)" Case 3: strTemp = strTemp & "действует на: текущий каталог, его подкаталоги и файлы)" Case 9: strTemp = strTemp & "действует на: только файлы текущего каталога)" Case 10: strTemp = strTemp & "действует на: только подкаталоги текущего каталога)" Case 11: strTemp = strTemp & "действует на: подкаталоги и файлы текущего каталога)" Case Else: strTemp = strTemp & "область действия не определена); " End Select strTemp = strTemp & vbNewLine & "---" & vbNewLine '------ '--- Определение типа записи If objEntry.AceType = ACCESS_ALLOWED_ACE_TYPE Then strTemp = strTemp & "РАЗРЕШЕНО:" & vbNewLine ElseIf objEntry.AceType = ACCESS_DENIED_ACE_TYPE Then strTemp = strTemp & "ЗАПРЕЩЕНО:" & vbNewLine End If '------ '--- Определение значения маски "Полный доступ" в зависимости от версии ОС If intVer < 52 Then lngTemp = FULL_ACCESS + Abs(objEntry.AceType - 1) * FLAG_SYNCHRONIZE 'Выражение FULL_ACCESS + Abs(objEntry.AceType - 1) * FLAG_SYNCHRONIZE 'учитывает разницу между значениями маски "Полный доступ" у записей разных типов 'в ОС версий "2000/XP" Else lngTemp = FULL_ACCESS + FLAG_SYNCHRONIZE End If '------ lngMask = objEntry.AccessMask Select Case Abs(lngMask) Case lngTemp: strTemp = strTemp & "Полный доступ" & vbNewLine Case GENERIC_ALL: strTemp = strTemp & "Полный доступ (универсальная маска)" & vbNewLine Case Else '--- Детальный анализ маски доступа текущей записи: 'обработка универсальных масок (биты №№ 29 - 31) If Abs(lngMask) > lngTemp Then For i = 0 To UBound(arrGenericValue) If lngMask And arrGenericValue(i) Then strTemp = strTemp & arrGenericName(i) & vbNewLine & vbTab & "{" & vbNewLine Select Case arrGenericValue(i) Case GENERIC_EXECUTE: arrTemp = arrSieveGE Case GENERIC_WRITE: arrTemp = arrSieveGW Case GENERIC_READ: arrTemp = arrSieveGR End Select For j = 0 To UBound(arrTemp) If arrTemp(j) Then strTemp = strTemp & vbTab & arrFlagName(j) & vbNewLine Next strTemp = strTemp & vbTab & "}" & vbNewLine End If Next End If 'обработка обычных масок (биты №№ 0 - 20) For i = 0 To UBound(arrFlagValue) If lngMask And arrFlagValue(i) Then strTemp = strTemp & arrFlagName(i) & vbNewLine End If Next '------ End Select strTemp = UCase(objEntry.Trustee.Domain & "\" & objEntry.Trustee.Name) & strTemp & "===" & vbNewLine If intMode = PART_MODE Then If StrComp(UCase(objEntry.Trustee.SIDString), strAccSID, vbTextCompare) = 0 Then strRes = strRes & strTemp End If Else strRes = strRes & strTemp End If Next End Function <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '********************************************************************************************** '* Имя: ACL_Register_CheckAccess.vbs * '* Язык: VBScript * '* Назначение: Проверка содержимого дескриптора безопасности объекта реестра Windows. * '* В ОС версий 2000 - 2003 проверка выполняется только для текущего пользователя. * '********************************************************************************************** Dim objReg, strComputer, strKeyPath, arrFlagName, strList, strTemp Dim blnHasRight, strAllowed, strDenied, intOSVersion, intResult Dim objSD, objACE, arrTypes Const HKCR = &H80000000 Const HKCU = &H80000001 Const HKLM = &H80000002 Const HKU = &H80000003 Const INHERITED_ACE = 16 strKeyPath = "Software" arrFlagName = Array("Запрос значения", "Задание значения", _ "Создание подраздела", "Перечисление подразделов", _ "Уведомление", "Создание связи", "Удаление", "Запись DAC", _ "Смена владельца", "Чтение разрешений") arrFlagValue = Array(&H1, &H2, &H4, &H8, &H10, &H20, &H10000, &H40000, &H80000, &H20000) arrTypes = Array("Разрешено с маской -> ", "Запрещено с маской -> ") strComputer = "." Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set objCollection = objWMI.ExecQuery("SELECT Version FROM Win32_OperatingSystem") For Each objItem In objCollection intOSVersion = CInt(Replace(Left(objItem.Version, 3), ".", "")) Next Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") strList = vbNullString If intOSVersion >= 60 Then intResult = objReg.GetSecurityDescriptor(HKLM, strKeyPath, objSD) If intResult = 0 Then strList = "Метод GetSecurityDescriptor" & vbNewLine & "======" & vbNewLine & vbNewLine If Not IsNull(objSD.DACL) Then For Each objACE In objSD.DACL If CBool(objACE.AceFlags And INHERITED_ACE) Then strTemp = " - унаследовано " intTemp = objACE.AceFlags - INHERITED_ACE Else strTemp = " - не унаследовано " intTemp = objACE.AceFlags End If Select Case intTemp Case 0: strTemp = strTemp & "(действует на: только текущий раздел); " Case 2: strTemp = strTemp & "(действует на: текущий раздел и его подразделы); " Case 6, 14: strTemp = strTemp & "(действует на: только ближайший подраздел текущего раздела); " Case 10: strTemp = strTemp & "(действует на: только подразделы текущего раздела); " Case Else: strTemp = strTemp & "(область действия не определена); " End Select strList = strList & objACE.Trustee.Domain & "\" & objACE.Trustee.Name & strTemp & arrTypes(objACE.AceType) & _ Abs(objACE.AccessMask) & vbNewLine & vbNewLine Next Set objACE = Nothing Else strList = "Список управления доступом (ACL) к заданному объекту пуст." End If Set objSD = Nothing Else strList = "Ошибка " & intResult & " при попытке чтения дескриптора безопасности объекта реестра." End If Else strList = "Метод CheckAccess" & vbNewLine & "======" & vbNewLine & vbNewLine For i = LBound(arrFlagValue) To UBound(arrFlagValue) objReg.CheckAccess HKLM, strKeyPath, arrFlagValue(i), blnHasRight If blnHasRight Then strAllowed = strAllowed & arrFlagName(i) & vbNewLine Else strDenied = strDenied & arrFlagName(i) & vbNewLine End If Next If Len(strAllowed) > 0 Then strList = strList & "РАЗРЕШЕНО:" & vbNewLine & "------" & vbNewLine & strAllowed If Len(strDenied) > 0 Then If Len(strAllowed) > 0 Then strList = strList & "======" & vbNewLine strList = strList & "ЗАПРЕЩЕНО:" & vbNewLine & "------" & vbNewLine & strDenied End If End If Set objReg = Nothing WScript.Echo strList WScript.Quit 0 |
Автор: AlexJ 20.03.07, 22:42 |
Запрет/разрешение сетевого подключения (разрешить/запретить инет) Под вистой очень просто: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> ' Сохранить как EnableDisableNIC.vbs strComputer = "." Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set objNetworkSettings = objWMIService.Get("Win32_NetworkAdapter ") If objNetworkSettings.Disable()=0 then 'If objNetworkSettings.Enable()=0 then MsgBox "Succes" else MsgBox "Error" end if Для всех остальных посложнее но не очень <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> <package> <job> <object id="objShell" progid="Shell.Application"/> <script language="VBScript"> '================================== ' сохранить как On-Off-NIC.wsf '================================== Option Explicit Dim objCP, objEnable, objDisable, colNetwork Dim clsConn, clsLANConn, clsVerb Dim strNetConn, strConn, strEnable, strDisable, strStatus Dim bEnabled, bDisabled strNetConn = "Network Connections" ' <-- поменять на русских версиях соответственно strConn = "Local Area Connection" ' <-- Поменять на реальное имя сетевого подключения strEnable = "En&able" strDisable = "Disa&ble" Set objCP = objShell.Namespace(3) '<-Control Panel Set colNetwork = Nothing For Each clsConn in objCP.Items If clsConn.Name = strNetConn Then Set colNetwork = clsConn.getfolder Exit For End If Next If colNetwork is Nothing Then WScript.Echo "Network folder not found" MsgBox "Network folder not found" WScript.Quit End If Set clsLANConn = Nothing For Each clsConn in colNetwork.Items 'В случае если сеть поименована как "........ connection 2", и т.д. If Instr(LCase(clsConn.name),LCase(strConn)) Then Set clsLANConn = clsConn Exit For End If Next If clsLANConn is Nothing Then WScript.Echo "Network Connection not found" MsgBox "Network Connection not found" WScript.Quit End If bEnabled = True Set objEnable = Nothing Set objDisable = Nothing For Each clsVerb in clsLANConn.verbs If clsVerb.name = strEnable Then Set objEnable = clsVerb bEnabled = False End If If clsVerb.name = strDisable Then Set objDisable = clsVerb End If Next If bEnabled Then objDisable.DoIt strStatus="disabled." Else objEnable.DoIt strStatus="enabled." End If ' Дать системе время для остановки/старта сетевого подключения WScript.Sleep 1000 MsgBox "Network connections " & strStatus </script> </job> </package> |
Автор: from_mars 21.03.07, 05:51 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> 'Имя: delRecent.vbs 'Язык: VBScript 'Назначение: Очищает "Пуск\Документы. У меня в быстром запуске стоит - удобно :)" Dim wsh, fso Set wsh = WScript.CreateObject("WScript.Shell") Set fso = CreateObject("Scripting.FileSystemObject") fso.DeleteFile(wsh.SpecialFolders("Recent") + "\*.*") |
Автор: Juretђ 21.03.07, 06:02 |
А чем тебя не устраивает параметр ClearRecentDocsOnExit в реестре? |
Автор: from_mars 21.03.07, 06:50 |
Не хочу чтоб автоматом чистилось.. Хочу чтоб сам |
Автор: Koss 22.03.07, 10:10 |
Цитата AlexJ, 19.03.2007, 1:08:19, 1489080 поменять можно (нелегально ) открыв файл и пройдясь по нему в поисках юникодовой строки FileVersion после которой будут юникодовые циферки, в ввиде обыкновенного текста, которые естественно можно подменить. Хмм.. Эт получаетса, что у меня тема лабораторной - крэкерство... лана.. А как в сценариях работать с ресурсами файла ???? |
Автор: ГлавВред 30.03.07, 10:14 |
AlexJ Цитата AlexJ @ ' Дать системе время для остановки/старта сетевого подключения WScript.Sleep 1000 MsgBox "Network connections " & strStatus </script> </job> </package> Эту функцию не плохо было бы реализовать через while, ибо кто те сказал что 1000 милисекунд 100% достаточно для рестарта сервиса. А так же он может горааздо рашьше перезапустьться, и эти 1000 милисекунд просто скрипт будет бездействовать... ИМХО не правильно все это... нужно переписать. |
Автор: AlexJ 05.04.07, 21:20 |
Цитата AlexLine @ Эту функцию не плохо было бы реализовать через while, ибо кто те сказал что 1000 милисекунд 100% достаточно для рестарта сервиса. А так же он может горааздо рашьше перезапустьться, и эти 1000 милисекунд просто скрипт будет бездействовать... ИМХО не правильно все это... нужно переписать. Не знаю , если ли смысл, скрипт гораздо массивнее получится и не читабельней, а толку только показать юзеру что сеть включена или выключена, в любом случае иконка сетевого подключения сообщит подключается или отключается сеть, а только из-за одно мессаджбокса WScript.Sleep 1000 MsgBox "Network connections " & strStatus накручивать... ИМХО не стоит, можно вообще выкинуть эти пару строк, а результат по иконке в трэе наблюдать. |
Автор: X11 06.04.07, 08:05 |
Уважаемые коллеги, не затруднит ли Вас создать скрипт, который сохранит объекты домена (WinServ 2003 R2) в текстовый файл в таком виде: ---------------------------- |Пользователь|Дата создания| ---------------------------- |User1 |26.12.2007 | |User2 |15.01.2001 | |User3 |26.10.2005 | ... ---------------------------- |Компьютер |Дата создания| ---------------------------- |Comp1 |02.01.2000 | |Comp2 |15.05.2006 | |Comp3 |12.10.2007 | ... Заранее благодарен. |
Автор: Dmitrii 09.04.07, 07:05 |
Например, так: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '***************************************************************** '* Имя: Users_Computers_List.vbs * '* Язык: VBScript * '* Назначение: Формирование списка учётных записей пользователей * '* и компьютеров домена с указанием даты их создания * '***************************************************************** Const strResFile = "C:\Users_Computers.txt" Set objRoot = GetObject("LDAP://RootDSE") strDomName = objRoot.Get("DefaultNamingContext") Set objRoot = Nothing strAttributes = "cn,whenCreated" arrCmdText = Array("<LDAP://" & strDomName & ">;(&(objectCategory=Person)(objectClass=User));" & strAttributes & ";Subtree", _ "<LDAP://" & strDomName & ">;(objectCategory=Computer);" & strAttributes & ";Subtree") arrCapLines = Array("|Пользователь|Дата создания|", "|Компьютер|Дата создания|") Set objConnection = CreateObject("ADODB.Connection") objConnection.Provider = "ADsDSOObject" objConnection.Open "Active Directory Provider" Set objCommand = CreateObject("ADODB.Command") Set objCommand.ActiveConnection = objConnection objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Sort On") = "cn" Set objFS = CreateObject("Scripting.FileSystemObject") Set objFile = objFS.CreateTextFile(strResFile, True) For i = LBound(arrCmdText) To UBound(arrCmdText) objCommand.CommandText = arrCmdText(i) Set objRSet = objCommand.Execute If objRSet.RecordCount > 0 Then objFile.WriteLine(arrCapLines(i)) objRSet.MoveFirst Do Until objRSet.EOF objFile.WriteLine("|" & objRSet.Fields(0).Value & "|" & DateValue(objRSet.Fields(1).Value) & "|") objRSet.MoveNext Loop End If If i < UBound(arrCmdText) Then objFile.WriteLine(vbCrLf) Next objFile.Close Set objFile = Nothing Set objFS = Nothing Set objRSet = Nothing Set objCommand = Nothing Set objConnection = Nothing WScript.Echo "Готово." |
Автор: Dmitrii 10.04.07, 03:10 |
X11, замените выражение objectClass=Computer на выражение objectCategory=Computer. В этом случае поиск будет выполняться раза в два быстрее (исходный пример я уже исправил). |
Автор: AlexLine 10.04.07, 07:25 |
Цитата Dmitrii @ X11, замените выражение objectClass=Computer на выражение objectCategory=Computer. В этом случае поиск будет выполняться раза в два быстрее (исходный пример я уже исправил). Конструктивное замечание! ЭтаПлюс |
Автор: ANDLL 11.04.07, 08:24 |
Need Не у кого нету скрпита, который бы скрывал\показывал указанный раздел? То есть один скрипт должен выставлять у раздела фланг hidden, а второй должен снимать флаг и устанавливать разделу букву. |
Автор: Pit-Bul 11.04.07, 10:27 |
а как сделать скрипт для копирования файлов, что то типа обновления |
Автор: Pit-Bul 11.04.07, 12:04 |
Сам сделал, если кому интересно то выглядит так <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Set fso = CreateObject("Scripting.FileSystemObject") If fso.FolderExists("C:\Program Files\grigor\GSK ToolBox") Then fso.CopyFile "p:\GSK\GSK ToolBox\GSK ToolBox.exe", "C:\Program Files\grigor\GSK ToolBox\GSK ToolBox.exe" Else fso.CreateFolder "C:\Program Files\grigor\GSK ToolBox" fso.CopyFile "p:\GSK\GSK ToolBox\GSK ToolBox.exe", "C:\Program Files\grigor\GSK ToolBox\GSK ToolBox.exe" End If If fso.FolderExists("C:\Program Files\grigor\GSK ToolBox") Then fso.CopyFile "p:\GSK\GSK ToolBox\SwToo.mdb", "C:\Program Files\grigor\GSK ToolBox\SwToo.mdb" Else fso.CreateFolder "C:\Program Files\grigor\GSK ToolBox" fso.CopyFile "p:\GSK\GSK ToolBox\SwToo.mdb", "C:\Program Files\grigor\GSK ToolBox\SwToo.mdb" End If |
Автор: Dmitrii 11.04.07, 12:55 |
Pit-Bul, если Вы захотите наблюдать за ходом копирования с помощью стандартного "прогресс"-индикатора, то обратите внимание на сценарий CopyFolder_with_Progress.vbs, который опубликован в сообщении #14. |
Автор: ...:::Alex:::... 11.04.07, 15:55 |
Цитата Полтонны примеров использования всей мощи WMI. Автор: SCINER скачать |
Автор: Dmitrii 12.04.07, 03:36 |
Думаю, лучше дать ссылку сразу на первоисточник, хотя бы уже потому, что современная редакция значительно богаче предложенной. http://www.microsoft.com/downloads/details...DA-B8814FE2DA5A |
Автор: Juretђ 13.04.07, 06:07 |
Цитата ANDLL @ А если просто монтировать раздел?Не у кого нету скрпита, который бы скрывал\показывал указанный раздел? То есть один скрипт должен выставлять у раздела фланг hidden, а второй должен снимать флаг и устанавливать разделу букву. Сделай .cmd на основе команды mountvol. Правда UID разделов будут разные на разных виндах одного компа и после переустановки оных. |
Автор: ANDLL 13.04.07, 06:15 |
Мне хотелось бы именно скрывать, это нужно что бы на другом компе диск не монтировался автоматически. |
Автор: X11 19.04.07, 09:11 |
Dmitrii, супер, весьма благодарен |
Автор: Pit-Bul 19.04.07, 12:24 |
Цитата Dmitrii @ Pit-Bul, если Вы захотите наблюдать за ходом копирования с помощью стандартного "прогресс"-индикатора, то обратите внимание на сценарий CopyFolder_with_Progress.vbs, который опубликован в сообщении #14. я туда смотрел, но так и не понял как связать PARAM_DIALOG с копированием файлов |
Автор: Dmitrii 20.04.07, 04:56 |
Константа PARAM_DIALOG отвечает за настройку режима отображения окна с индикатором. Чтобы копировать не каталог, а файл надо изменить значение константы sourceDirSpec, например: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Const sourceDirSpec = "C:\1.CAB" Примечания. 1. Если копируемый файл имеет небольшой размер (с точки зрения производительности компьютера), то ОС просто не успеет отобразить окно с индикатором. Именно поэтому я предложил использовать индикацию при копировании каталога, а не файла, т.к. размеры каталогов обычно достаточно велики. 2. Что касается значений константы PARAM_DIALOG, то вот выдержка из MSDN: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Optional. Specifies options for the copy operation. This value can be zero or a combination of the following values. These values are based upon flags defined for use with the fFlags member of the C++ SHFILEOPSTRUCT structure. These flags are not defined as such for Microsoft Visual Basic, Visual Basic Scripting Edition (VBScript), or Microsoft JScript, so you must define them yourself or use their numeric equivalents. 4 - Do not display a progress dialog box. 8 - Give the file being operated on a new name in a move, copy, or rename operation if a file with the target name already exists. 16 - Respond with "Yes to All" for any dialog box that is displayed. 64 - Preserve undo information, if possible. 128 - Perform the operation on files only if a wildcard file name (*.*) is specified. 256 - Display a progress dialog box but do not show the file names. 512 - Do not confirm the creation of a new directory if the operation requires one to be created. 1024 - Do not display a user interface if an error occurs. 2048 - Version 4.71. Do not copy the security attributes of the file. 4096 - Only operate in the local directory. Don't operate recursively into subdirectories. 9182 - Version 5.0. Do not copy connected files as a group. Only copy the specified files. Если никакие особые настройки не нужны, то этот параметр можно просто опустить. |
Автор: mr.Neo 11.05.07, 19:03 |
случайно нет скриптика который прописывает рабочую группу на локальном компе? |
Автор: Dmitrii 14.05.07, 04:31 |
"Прописывает" - это значит создаёт новую? Если так, то вот пример: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> strGroupName = "New_group" strCompName = "WS_name" strDomainName = "Domain_name" Set objComputer = GetObject("WinNT://" & strDomainName & "/" & strCompName) Set objGroup = objComputer.Create("group", strGroupName) objGroup.SetInfo Set objGroup = Nothing Set objComputer = Nothing 1. Вместо New_group, WS_name, Domain_name подставьте реальные значения. 2. Если домена нет, то соответствующим образом упростите строку Set objComputer = ... |
Автор: mr.Neo 17.05.07, 18:54 |
Цитата "Прописывает" - это значит создаёт новую? скорее всего заменяет ту которая есть.... strDomainName = "Domain_name" - это можно удалить? Set objComputer = GetObject("WinNT://" & strCompName) - а это будет так? |
Автор: Dmitrii 18.05.07, 03:56 |
Это как? Можно. Так. |
Автор: GREY17 18.06.07, 16:31 |
Народ, никто не знает как накатать скриптик, чтобы при появлении в данной папке новых файлов, они бы автоматически копировались в другую указанную папку и если там уже есть одноименные файлы, то происходиоа бы автозамена. |
Автор: AlexLine 18.06.07, 16:55 |
Цитата GREY17 @ Народ, никто не знает как накатать скриптик, чтобы при появлении в данной папке новых файлов, они бы автоматически копировались в другую указанную папку и если там уже есть одноименные файлы, то происходиоа бы автозамена. А ДФС и система репликаций - не судьба? или просто не те масштабы? |
Автор: GREY17 18.06.07, 17:12 |
Я не воткну как сделать так чтоб при появлении новых файлов в папке, они сразу копировались в другую. Добавлено ВСЕ ура допер. Только вот еще одна проблема: Как сделать чтобы при появлении файлов в папке (только скопировались в нее), у нее открувался общий доступ? Добавлено Балин, не допер . Не пойму как это сделать, как заставить их копироваться, как только они добавились? Добавлено 2 проблемы, а решил только 0.5 из них . Тупею с годами наверное. Добавлено HELP ME PLEASE! Кто нибудь |
Автор: AlexLine 19.06.07, 06:32 |
GREY17, объяснишь идею, ответишь на предыдущий вопрос, поможем |
Автор: Dmitrii 19.06.07, 10:26 |
Цитата GREY17 @ Так, например:Народ, никто не знает как накатать скриптик, чтобы при появлении в данной папке новых файлов, они бы автоматически копировались в другую указанную папку и если там уже есть одноименные файлы, то происходиоа бы автозамена. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim strFile, strTemp Dim x, y Dim objWMI, objEventsCollection, objEvent, objFS Const strSourceDirWMI = "C:\\\\Source" Const strSourceDir = "C:\Source\" Const strTargetDir = "C:\Target\" 'On Error Resume Next Set objFS = CreateObject("Scripting.FileSystemObject") If objFS.FolderExists(strSourceDir) And objFS.FolderExists(strTargetDir) Then Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") Set objEventsCollection = objWMI.ExecNotificationQuery _ ("SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE " _ & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _ & "TargetInstance.GroupComponent= " _ & "'Win32_Directory.Name=""" & strSourceDirWMI & """'") Do Set objEvent = objEventsCollection.NextEvent strTemp = objEvent.TargetInstance.PartComponent x = InStrRev(strTemp, "\") y = Len(Mid(strTemp, x + 1)) - 1 strFile = Mid(strTemp, x + 1, y) objFS.CopyFile strSourceDir & strFile, strTargetDir, True 'objFS.DeleteFile strSourceDir & strFile, True Loop End If |
Автор: AlexJ 19.06.07, 13:18 |
Вот здесь еще http://forum.wincmd.ru/viewtopic.php?t=971&postdays=0&postorder=asc&start=15 гляньте посты от "Бати", "резидентный" скриптик который переименовывает файлы. |
Автор: GREY17 19.06.07, 18:09 |
Все. Классно. И пришло счастье. Огромное спасибо. |
Автор: GREY17 20.06.07, 15:39 |
Масштабы то наверное и те, но увы, изобразить у меня этого не получается, точнее получилось но немного не то, не одуплюсь как автопереименовывание файлов делать. Блин, обидно: потребности то растут, а удовлетворить то их не получается. Добавлено Народы, а никто не знает как изваять скрипт, который бы открывал общий доступ к папке. (Нужно для сетки). |
Автор: GREY17 21.06.07, 20:03 |
Вот я что то и изваял. Посмотрите, правильно ли это? <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim Mysleep Mysleep = 10000 Const FILE_SHARE = 0 Const MAXIMUM_CONNECTIONS = 5 strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set objNewShare = objWMIService.Get("Win32_Share") Do errReturn = objNewShare.Create _ ("C:\FSO", "FSO", FILE_SHARE, _ MAXIMUM_CONNECTIONS) Wscript.Sleep Mysleep Loop WScript.Quit |
Автор: veksler 16.07.07, 13:08 |
Народ, кто знает как написать скрипт входа который менял бы разрешение экрана? |
Автор: qwester 06.08.07, 14:39 |
Возникла необходимость проверять запущен ли Norton Antivirus на ПК. С NAV до 2007 проблем не возникает - проверяется процесс и запись в реестре на дату обновления антивирусной базы. В 2007 подобное не получается. Список процессов не меняется вне зависимости от того активен ли "Auto protect" или выключен. Так же в реестре отсутвует запись об обновлении. При попытке обратиться в Symantec был получен ответ : "Hear is the information the engineer has given me to give to you and it should resolve the issue. I have asked for the engineer to call you or contact you and all I can get is the following. From what I read about this defect, the intent is to find out if NAV 2007 is installed on the machine and whether AP is enabled or not. In 2007 all this information should be available through the WMI/WSC. We do not publish any interfaces to query whether we are installed or what the status is for the various features. You can also check the InstalledApps key in the registry to determine if NAV 2007 is installed. The status of AP can be queried from WMI/WSC." К сожалению с WMI/WSC я ни разу не работал. Попробовал разобраться - выложенный здесь ListProcesses.vbs разницы между активным и дезактивированным "Auto protect" не различается. Как мне кажется - должен быть провайдер для NAV созданный самим NAV при устанвке? К сожалению его я обнаружить не смог. Возможно я ошибаюсь. Буду благодарен как за пример работы с NAV через VMI , так и за направление на пиоск решения данной проблеммы. |
Автор: AlexJ 06.08.07, 15:32 |
По поводу наличия провайдера WMI в антивирусах - это надо связываться с разработчиками. А по поводу определения запущен ли антивирус - самый простой способ пытаться удалить(сделав предварительно копию) ЕХЕ-шку антивиря. Если удаляется значит не запущен (в юзер моде в любом случае будет отказ на удаление, но в юзер моде и запрет на остановку АВ тоже имеется) |
Автор: qwester 06.08.07, 15:49 |
2 Profi: Спасибо за ответ. Те получить просто имя провайдера (например в программе WMI CIM Studio или в чем то подобном) невозможно? К сожалению совет по поводу простого способа не подходит, предполагается использовать проверку на ПК выполняющих вход в домен и соответсвенно дюбые действия которые _могут_ нанести вред или что либо изменить в ПК пользователя просто не допустимы К тому же судя по предъидущим версиям NAV - "Auto protect" при запрещении его пользователем просто переходит из состояния Started в состояние Paused. И соотвественно раз процесс запущен то попытка удаления будет безуспешной, несмотря на то что безопасность ПК будет неудовлетворять требованиям входа в домен. |
Автор: AlexJ 06.08.07, 16:19 |
Цитата qwester @ Те получить просто имя провайдера (например в программе WMI CIM Studio или в чем то подобном) невозможно? Я пасс, не знаю. Если у вас машина входит в домен, то значительно большую защиту машин (чем антивирусом) вы можете обеспечить путем перевода машин в юзер-моду с ограничением доступа к системным каталогам. |
Автор: qwester 06.08.07, 16:30 |
Жаль , может кто еще подскажет. А по поводу защиты - проверка NAV это один из пунктов. Там много всяких проверок - на присутствие update от мелкософта (по Microsoft Security Bulletin). К тому же подключаться могут через VPN с личных/домашних ПК и их загонять в юзер-моду с ограниченьями - моветон. И вот на этом самом пункте и произошел затык. Попытка использовать WMI/WSC - из-за ответа Symantec которое я процитировал выше. Хотя как мне кажется это просто отписка . |
Автор: AlexJ 06.08.07, 17:09 |
Цитата qwester @ Попытка использовать WMI/WSC - из-за ответа Symantec которое я процитировал выше. Хотя как мне кажется это просто отписка . Не похоже, "We do not publish any interfaces to query whether we are installed or what the status is for the various features." Это скорее всего их "ноу-хау" или не документированный интерфейс, за что сцецы IT так сильно и "любят" симантек, уронить производительность системы в несколько раз - это у них запросто, а вот дать интерфейс на то чтобы проверить статус работает ли этот монстр или нет - это видимо сложно. |
Автор: DataKill 06.08.07, 19:47 |
Всем привет. Уже долго роюсь в нете в поисках какой-то инфы по поводу написанию VBScript-ов. Может кто-то спасти Если у кого-то есть какие-то ссылки, буду очень рад |
Автор: AlexJ 07.08.07, 05:40 |
Полезные скрипты (сообщение #1520549) |
Автор: Dmitrii 16.08.07, 06:37 |
Цитата qwester @ Если ещё актуально, то предложу пару советов. Сразу оговорюсь, что на практике с такой задачей никогда не сталкивался, поэтому советы будут носить исключительно теоретический характер.Возникла необходимость проверять запущен ли Norton Antivirus на ПК. С NAV до 2007 проблем не возникает - проверяется процесс и запись в реестре на дату обновления антивирусной базы. В 2007 подобное не получается. Список процессов не меняется вне зависимости от того активен ли "Auto protect" или выключен. 1. Поиск WMI-провайдера для NAV. 1.1. Определяем список всех WMI-провайдеров в раскладке по пространствам имён (пример сценария - ниже). 1.2. Ориентируясь на названия пространств имён и провайдеров (к сожалению, я не знаю, можно ли идентифицировать провайдера по его вендору), пытаемся выбрать тот, который мог бы относиться к NAV. 1.3. Используя выбранные названия пространства имён и работающего в нём провайдера, определяем список классов, с которыми данный провайдер работает (пример сценария - ниже). 1.4. Используя какую-либо утилиту типа "WMI CIM Studio", смотрим описание найденных классов. Сценарий для пункта 1.1: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> 'Список всех WMI-провайдеров для всех пространств имён Dim strTemp, arrNameSpace, objWMI, objCollection, objItem Dim objFS, objFile Const strCompName = "." 'для работы с удалённой станцией замените точку на dns-имя станции Const strResFile = "C:\List_WMI_Providers.txt" Call Enum_NameSpaces("root", strTemp) arrNameSpace = Split(Left(strTemp, Len(strTemp) - 1), ";") strTemp = vbNullString For i = LBound(arrNameSpace) To UBound(arrNameSpace) Set objWMI = GetObject("winmgmts:\\" & strCompName & "\" & arrNameSpace(i)) Set objCollection = objWMI.InstancesOf("__Win32Provider") If objCollection.Count > 0 Then strTemp = strTemp & UCase(arrNameSpace(i)) & vbCrLf & "---" & vbCrLf For Each objItem In objCollection strTemp = strTemp & objItem.Name & vbCrLf Next strTemp = strTemp & vbCrLf & vbCrLf End If Next Set objFS = CreateObject("Scripting.FileSystemObject") Set objFile = objFS.CreateTextFile(strResFile, True) objFile.Write (strTemp) WScript.Echo "Готово." Function Enum_NameSpaces(strNameSpace, strTemp) Dim objWMI, objCollection, objItem strTemp = strTemp & strNameSpace & ";" Set objWMI = GetObject("winmgmts:\\" & strCompName & "\" & strNameSpace) Set objCollection = objWMI.InstancesOf("__NAMESPACE") For Each objItem In objCollection Call Enum_NameSpaces(strNameSpace & "\" & objItem.Name, strTemp) Next Set objCollection = Nothing Set objWMI = Nothing End Function Сценарий для пункта 1.3: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> 'Определение списка классов для заданного провайдера Dim objWMI, objCollection, objClass, objClassQual Dim strProvName, arrProvClasses(), intItem Dim objFS, objFile Const strCompName = "." 'для работы с удалённой станцией замените точку на dns-имя станции Const strNameSpace = "root\default" 'замените на название выбранного пространства имён Const strFindProv = "RegProv" 'замените на название выбранного провайдера Const strResFile = "C:\List_WMI_Classes.txt" intItem = 0 Set objWMI = GetObject("winmgmts:\\" & strCompName & "\" & strNameSpace) Set objCollection = objWMI.SubclassesOf() For Each objClass In objCollection For Each objClassQual In objClass.Qualifiers_ If LCase(objClassQual.Name) = "dynamic" Then strProvName = Detect_ProviderName(objClass) If Len(strProvName) > 0 Then If StrComp(strProvName, strFindProv, vbTextCompare) = 0 Then intItem = intItem + 1 ReDim Preserve arrProvClasses(intItem) arrProvClasses(intItem) = objClass.Path_.Class End If End If End If Next Next Set objCollection = Nothing Set objWMI = Nothing If intItem > 0 Then arrProvClasses(0) = "Кол-во классов: " & intItem Set objFS = CreateObject("Scripting.FileSystemObject") Set objFile = objFS.CreateTextFile(strResFile, True) For i = 0 To intItem objFile.WriteLine (arrProvClasses(i)) Next objFile.Close Set objFile = Nothing Set objFS = Nothing WScript.Echo "Готово." Else WScript.Echo "Ничего не найдено." End If Function Detect_ProviderName(objC) Dim objCQ, strTemp strTemp = vbNullString For Each objCQ In objC.Qualifiers_ If LCase(objCQ.Name) = "provider" Then strTemp = objCQ.Value Exit For End If Next Detect_ProviderName = strTemp End Function 2. Определение активности антивирусного сторожа. Если сторож в NAV, подобно сторожу в DrWeb, реализован в форме службы, то можно попытаться оценить его активность по состоянию этой службы. Вот пример сценария: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim objWMI, objCollection, objItem Const strCompName = "." 'для работы с удалённой станцией замените точку на dns-имя станции Const strServiceName = "SpIDer Guard for Windows NT" 'замените на выводимое имя службы для NAV, 'т.е. на то, которое отображается в колонке "Имя" окна "Службы" Set objWMI = GetObject("winmgmts:\\" & strCompName & "\root\CIMV2") Set objCollection = objWMI.ExecQuery("select * from Win32_Service where DisplayName='" & strServiceName & "'") If objCollection.Count > 0 Then For Each objItem In objCollection Wscript.Echo "Активность службы: " & CStr(objItem.Started) Next Else Wscript.Echo "Ничего не найдено." End If Set objCollection = Nothing Set objWMI = Nothing Напоследок предложу пару ссылок на полезные утилиты для интерактивной работы с WMI: WMICodeCreator Scriptomatic2 Они подобны WMI CIM Studiuo, но попроще. Надеюсь, что хоть чем-нибудь помог Вам. |
Автор: qwester 27.08.07, 13:28 |
Сенкс всем! Как оказалось - ларчик просто открывался : On Error Resume Next Set oWMI = GetObject("winmgmts:\\.\root\SecurityCenter") Set colItems = oWMI.ExecQuery("Select * from AntiVirusProduct") naw = "Norton AntiVirus not Installed" For Each item In colItems if (item.displayName = "Norton AntiVirus") then if (item.onAccessScanningEnabled = "True") then naw = "Norton AntiVirus Active" else naw = "Norton AntiVirus not Active" end if end if WScript.Echo naw Next Вместо WScript.Echo naw - используется что угодно для передачи параметра куда необходимо. Так же есть item.productUptoDate и item.versionNumber |
Автор: bond009 12.09.07, 22:10 |
В скриптинге только учусь не помогли бы вы мне с одной проблемкой. Мне нужно например дату сравнить с другой датой и выяснить разницу количество дней. date_1 = date() date_2 = date() Как перевести дату в формат timestamp ? или тут такого нет ? |
Автор: Dmitrii 13.09.07, 06:41 |
Цитата bond009 @ Мне нужно например дату сравнить с другой датой и выяснить разницу количество дней. Используйте функцию DateDiff() |
Автор: nalek 13.09.07, 12:22 |
можно так (jscript): <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> var d1 = new Date("12/31/2006"); var d2 = new Date("9/13/2007"); var d3 = d2-d1; // разница в миллисекундах // d3/1000 = sec // (d3/1000)/60 = min // (d3/1000/60)/60 = hour // (d3/1000/60/60)/24 = days WScript.Echo(d3/1000/60/60/24); // = ~256 |
Автор: Mbus 19.09.07, 06:19 |
Цитата AlexLine @ Скрипт отображающий в параметре Comp_Display_Name FullName залогиненого на машину пользователя Не могли бы подсказать как это сделать? я скрипты никогда не писала. Мне нужно чтобы скажем ко мне на почту отсылалось или просто в какйо-то лог писалось под каким именем на любом компьютере в локальной сети вошли. И еще можно как-то соорудить скрипт или что-то иное, чтобы также логилось или отсылалось кто в сети запустил программу из меню "Запуск от имени"? |
Автор: DataKill 19.09.07, 19:01 |
Люди Хелп!!! Живу в общежитии. Собираемся проводить сеть (приблизительно 100 комнат). Хотелося бы написать скрипт, для автоматической настройки сети. Чтоб при запуске скрипта, на каждом компьютере устанавливались персональные настройки (IP, маска, шлюз, DNS-сервер и т.д.). Желательно, чтоб еще IP адрес менялся автоматически. Заранее спасибо |
Автор: --= Eagle =-- 19.09.07, 19:14 |
DataKill, а DHCP поднять не судьба? |
Автор: Mbus 26.09.07, 12:06 |
Воспользовшись имеющимся здесь скриптом (разница: strAttributes = "cn,sAMAccountName") получила файл с именами пользователей ActiveDirectory в таком виде: имя пользователя|логин|пароль Например: Иванов Иван Иваныч|IvanovII|iva23 Не получается только пароль вытащить, вернее не знаю какой это параметр, просто Password не подходит. Подскажите, можно ли вытащить имеющийся параоль? Поэтому пока пароль у всех писался в файл одинаковый. Птом на основе этого файла можно внести пользователей в ActiveDirectory в случае переустановки или т.п. Для этого используется скрипт: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Set objParent = GetObject("LDAP:// dc=my, dc=rus") Dim fso, f On Error Resume Next Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile("C:\Users.txt", 1, False) if Err.Number<>0 then call Error_(0) Else while not f.atEndOfStream s = Split(f.ReadLine,"|") 'UserName="имя пользователя" 'UserFam="фамилия пользователя" UserFIO=s(0) UserAccount=s(1) UserPass=s(2) 'WScript.Echo UserFIO & " " & UserAccount & " " & UserPass Set objUser = objParent.Create("user","cn=" & UserFIO) 'имя аккаунта objUser.Put "sAMAccountName", UserAccount 'логин objUser.Put "userPrincipalName", UserAccount & "@my.rus" 'логин 'objUser.Put "givenName", UserName 'имя 'objUser.Put "sn", UserFam 'фамилия objUser.Put "displayName", UserFIO 'выводимое имя objUser.Put "homeDrive", "Z" 'имя диска для подключения домашнего каталога objUser.Put "homeDirectory", "<путь>" & UserAccount 'домашний каталог пользователя objUser.Put "scriptPath", "<имя файла сценария>" 'сценарий входа objUser.SetInfo objUser.SetPassword(UserPass) 'пароль objUser.SetInfo objUser.AccountDisabled=FALSE 'учетная запись активна objUser.SetInfo objUser.Put "userAccountControl", 65536 'срок действия пароля не ограничен objUser.SetInfo Err.Clear wend f.Close end if Можно сказать, что все работает, но есть пару вопросов, которые не знаю как реализовать: 1. В консоли ActiveDirectory все пользователи размещаются не просто в домене а в подпапке (подразделе) Users, как там создавать пользователя???? не вышло пока никак, на ou=Users ругается 2. Как поставить галочку нельзя менять пароль в свойствах пользователя??? какой код? |
Автор: sbonus 04.10.07, 04:49 |
Доброго времени суток. Вопрос, как с локального компьютера примапить диск? Примапить из домена, локальный в воркгруппе, юзер и пароль соответсвенно известны. Точнее задача -- как передать в теле скрипта username и password. Заранее спасибо! |
Автор: AlexJ 05.10.07, 01:28 |
А разве это Полезные скрипты (сообщение #1484865) не то ? |
Автор: Dmitrii 05.10.07, 11:20 |
Легальными средствами нельзя. Цитата Mbus @ Для начала посмотрите уже имеющиеся в этой теме примеры: Полезные скрипты, сообщение #5, а затем вот этот пример:В консоли ActiveDirectory все пользователи размещаются не просто в домене а в подпапке (подразделе) Users, как там создавать пользователя? <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim strPath, strUsrSAMAN, intUserAC Dim objAD, objContainer, objUser strPath = "LDAP://ou=Пользователи,ou=Склад,dc=domain_name,dc=ru" strUsrSAMAN = "Кладовщик" Set objContainer = GetObject(strPath) Set objAD = objContainer.Create("user", "cn=" & strUsrSAMAN) objAD.Put "sAMAccountName", strUsrSAMAN objAD.Put "displayName", strUsrSAMAN objAD.Put "userPrincipalName", strUsrSAMAN objAD.SetInfo Речь идёт о свойстве пользовательской "учётки" Запретить смену пароля пользователем? Цитата DataKill @ В групповой политике для всего домена задайте входной сценарий. Такой, например:Мне нужно чтобы ... в какйо-то лог писалось под каким именем на любом компьютере в локальной сети вошли <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim objAD, objUserName, objComputerName Dim objFS, objFile Const strPath = "C:\Temp\Log.txt" 'Здесь надо задать UNC-путь к доступному для всех пользователей на запись сетевому ресурсу Const ForAppending = 8 Set objAD = CreateObject("ADSystemInfo") Set objUserName = GetObject("LDAP://" & objAD.UserName) Set objComputerName = GetObject("LDAP://" & objAD.ComputerName) Set objFS = CreateObject("Scripting.FileSystemObject") Set objFile = objFS.OpenTextFile(strPath, ForAppending, True) objFile.WriteLine(Date & ";" & Time & ";" & objComputerName.cn & ";" & objUserName.cn) objFile.Close Set objFS = Nothing Set objFile = Nothing Set objUserName = Nothing Set objComputerName = Nothing Set objAD = Nothing Цитата Mbus @ В принципе можно, но здесь дело посложнее, т.к. нужно организовать (для каждой станции) процедуру слежения за системным событием создания процесса. Хотите подзаняться WMI? И еще можно как-то соорудить скрипт или что-то иное, чтобы также логилось или отсылалось кто в сети запустил программу из меню "Запуск от имени"? |
Автор: zerghack007 19.11.07, 06:26 |
Многие скрипты требуют наличия прав админа для своего выполнения. Как скриптом получить права админа? Вот например мне надо в рабочей группе из 20 компов создать юзера "test" и задать его пароль. Меня нет в этом офисе. Но я скинул по почте скрипт. У пользователей права юзеров. Пароль можно светить. |
Автор: Domino 19.11.07, 09:08 |
О каком пароле речь? Если о пароле пользователя test, то никак. Если о пароле админа, то два варианта: 1. Залогиниться под админом и выполнить скрипт. 2. Создать ярлык с путем %windir%\system32\wscript.EXE "C:\Documents and Settings\<username>\Рабочий стол\script.vbs" и дальше Run as... |
Автор: zerghack007 19.11.07, 09:33 |
Речь идет о пароле админа. Цитата 2. Создать ярлык с путем %windir%\system32\wscript.EXE "C:\Documents and Settings\<username>\Рабочий стол\script.vbs" и дальше Run as... В данном случае получается, что я должен сообщить Логин и Пароль админа пользователям, а я спрашивал про возможность получать права админа скриптом - просто нужно что бы в скрипте задавался параметр, что всё что дальше будет в нём происходить - будет происходить с правами локального администратора |
Автор: zerghack007 19.11.07, 11:16 |
Вот что-то такое нашел. Но не работает. ! Теги CODE Кто ставить будет? Страуструп? On Error Resume Next Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator") CompName = "compname" 'имя компьютера UserName = "firma.local\Admin" 'имя пользователя Pass = "password" 'пароль пользователя Set objServices = objSWbemLocator.ConnectServer(CompName, "root\CIMV2", UserName, Pass) If Err.Number <> 0 Then WScript.Echo Err.Number & ": " & Err.Description WScript.Quit End If Dim objComputer ' Экземпляр объекта Computer Dim objUser ' Экземпляр объекта User Dim strUser ' Имя создаваемого пользователя ' Задаем имя пользователя strUser = "test" Set objComputer = objServices.GetObject("WinNT://compname") Set objUser = objComputer.Create("user",strUser) objUser.Description = "Этот пользователь создан из сценария ADSI" ' Сохраняем информацию на компьютере objUser.SetInfo |
Автор: Dmitrii 19.11.07, 11:35 |
zerghack007, если использовать сценарии, то скрыть пароль администратора домена не удастся, т.к. сценарий - не более, чем простой текстовый файл, содержимое которого не сможет посмотреть только ленивый. При этом совершенно неважно, какой технологией Вы будете пользоваться: WMI или ADSI. Если речь о том, что нельзя задать пароль пользователя при создании его "учётки" с помощью сенария, то это НЕВЕРНО. За решение этой задачи отвечает метод SetPassword объекта типа Пользователь. Пример от AlexLine можно увидеть в самом первом сообщении этой темы. |
Автор: zerghack007 21.11.07, 04:46 |
Нашел выход из ситуации и пароль светить не надо. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '******************************************************************** ' Имя: AddUser.vbs ' Язык: VBScript ' Описание: Создание нового локального пользователя компьютера '******************************************************************** Option Explicit 'Объявляем переменные Dim objComputer ' Экземпляр объекта Computer Dim objUser ' Экземпляр объекта User Dim strComputer ' Имя компа Dim strUser ' Имя создаваемого пользователя Dim strpass ' пароль пользователя ' Задаем имя пользователя и пароль strComputer = "." strUser = "test" strpass = "1" ' Связываемся с компьютером Set objComputer = GetObject("WinNT://"& strComputer) ' Создаем объект класса User Set objUser = objComputer.Create("user",strUser) ' Добавляем описание и пароль созданного пользователя objUser.Description = "Этот пользователь создан из сценария ADSI" objUser.SetPassword strpass ' Сохраняем информацию на компьютере objUser.SetInfo <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '******************************************************************** ' Имя: StartRemouteScript.vbs ' Язык: VBScript ' Описание: Запуск скрипта на удаленном компе '******************************************************************** On Error Resume Next Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator") CompName = "Имя компа" 'имя компьютера UserName = "Имя пользователя"'имя пользователя Pass = "Пароль" 'пароль пользователя Set objServices = objSWbemLocator.ConnectServer(CompName, "root\CIMV2", UserName, Pass, Null, Null, 0) If Err.Number <> 0 Then WScript.Echo Err.Number & ": " & Err.Description WScript.Quit End If Set objClass = objServices.Get("Win32_Process") Res = objClass.Create("wscript.exe C:\AddUser.vbs", Null, Null, PID) If Res <> 0 Then WScript.Echo "Код ошибки: " & Res End If Единственная проблема в том, что я могу запустить скрипт только с локального диска. А как его запустить с замапленного диска? И еще вопрос: как скопировать фаил с локального диска на другой комп по сети (путь должен быть такой "\\compname\C$") И еще один вопросик: можно ли тачку из домена вывести скриптом? |
Автор: Dmitrii 23.11.07, 11:01 |
Или я чего-то не понимаю в условиях Вашей задачи, или Вы ошибаетесь, делая указанный выше вывод. По поводу сценария, помещённого в Вашем сообщении #81. Как единое целое он не может работать в принципе, т.к. в нём делается попытка совместить технологии WMI и ADSI. В указанной ниже строке зелёным цветом помечено то, что относится к ADSI, красным - к WMI. Set objComputer = objServices.GetObject("WinNT://compname") |
Автор: padonak 09.12.07, 08:29 |
срочно нужен скропт который в зависимости от аргумента скрипта или откл сетевой диск или проверить его сеществование первый аргумент скрпта ключ /d или /r второй аргумент имя сетевого диска |
Автор: VBMAD 10.12.07, 10:37 |
Нужен скрипт, который бы отслеживал запускаемый процесс и скрывал его окно. Если у кого есть поделитесь, пож-ста. Такой не подходит: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Set objApp = CreateObject("Shell.Application") ' Запуск файла objApp.ShellExecute "LineRec.exe", nil, nil, open, 0 |
Автор: blackangel 13.12.07, 09:34 |
Господа! Кто может показать как написать vbs-скрипт удаления сервиса и остановки процесса? Спасибо огромное тому кто откликнется! |
Автор: Dmitrii 14.12.07, 10:13 |
Насколько мне известно, удалить службу нельзя, можно лишь её остановить и запретить запуск. Пример подобного управления службой: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim objWMI, objCollection, objItem, intRetCode Const strService = "Alerter" Set objWMI = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\.\root\cimv2") Set objCollection = objWMI.ExecQuery("SELECT StartMode,State FROM Win32_Service WHERE Name='" & strService & "'") For Each objItem In objCollection 'WScript.Echo objItem.StartMode & vbCr & objItem.State If StrComp(objItem.State, "Stopped", vbTextCompare) = 0 Then If StrComp(objItem.StartMode, "Disabled", vbTextCompare) = 0 Then intRetCode = objItem.ChangeStartMode("Manual") End If If intRetCode = 0 Then intRetCode = objItem.StartService If intRetCode = 0 Then WScript.Echo "Служба запущена. Режим её запуска изменён." Else WScript.Echo "Службу запустить не удалось." End If Else WScript.Echo "Режим запуска службы изменить не удалось." End If Else intRetCode = objItem.StopService If intRetCode = 0 Then intRetCode = objItem.ChangeStartMode("Disabled") If intRetCode = 0 Then WScript.Echo "Служба остановлена. Режим её запуска изменён." Else WScript.Echo "Служба остановлена, но режим её запуска изменить не удалось." End If Else WScript.Echo "Службу остановить не удалось." End If End If Next Set objCollection = Nothing Set objWMI = Nothing |
Автор: blackangel 14.12.07, 11:47 |
Вот код завершения процесса на удаленной машине с правами указанного пользователя(взят из MSDN). Почему этот скрипт не работает с машины которую я указываю в "FullComputerName", т.е. локально? Указанный пользователь- доменный администратор. Пишет ошибку: User credentials cannot be used for local conections Как это обойти? <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> strComputer = "FullComputerName" strDomain = "DOMAIN" strUser = InputBox("Enter user name") strPassword = InputBox("Enter password") Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator") Set objWMIService = objSWbemLocator.ConnectServer(strComputer, _ "root\CIMV2", _ strUser, _ strPassword, _ "MS_409", _ "ntlmdomain:" + strDomain) Set colProcessList = objWMIService.ExecQuery _ ("SELECT * FROM Win32_Process WHERE Name = 'notepad.exe'") For Each objProcess in colProcessList objProcess.Terminate() Next И еще вопросик. Если я помещаю скрипт с указанными правами админа в стартап GP, не грозит ли засветить паролем? На сколько безопасно выкладывать такие скрипты? Спасибо! |
Автор: Dmitrii 14.12.07, 13:50 |
Вы пробовали запускать сценарий на том компьютере, на котором работаете сами, или на удалённом? У меня, например, этот сценарий работает только при указании удалённой станции. Цитата blackangel @ В принципе, кто знает, где искать, тот найдёт стартующий сценарий, и, разумеется, увидит пароль. Если я помещаю скрипт с указанными правами админа в стартап GP, не грозит ли засветить паролем? |
Автор: blackangel 14.12.07, 14:13 |
Цитата Dmitrii @ Вы пробовали запускать сценарий на том компьютере, на котором работаете сами, или на удалённом? У меня, например, этот сценарий работает только при указании удалённой станции. да, именно так! Как запустить скрипт под учетной записью доменного администратора на машине с которой запускаю скрипт(речь идет только про локальную машину)? |
Автор: sbonus 27.12.07, 06:12 |
Господа, как копировать файлы по заданной маске? |
Автор: Dmitrii 28.12.07, 09:52 |
Цитата blackangel @ Предлагаю использовать "эффект зеркала":да, именно так! Как запустить скрипт под учетной записью доменного администратора на машине с которой запускаю скрипт(речь идет только про локальную машину)? - сценарий на исходной станции запускает (с правам администратора домена) сценарий на контроллере домена; - сценарий, запущенный на контроллере домена, уже на исходной станции выполняет (с указанными ему привилегиями) нужную задачу. Пример сценария, запускаемого на исходной станции: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim strComputer, strUser, strPassword Dim objLocator, objConnection, objProcess Const strDomain = "domain_name\" strComputer = "domain_controller_name" strUser = InputBox("Имя") If Len(strUser) > 0 Then strUser = strDomain & strUser strPassword = InputBox("Пароль") If Len(strPassword) > 0 Then Set objLocator = CreateObject("WbemScripting.SWbemLocator") Set objConnection = objLocator.ConnectServer(strComputer, "root\cimv2", strUser, strPassword) Set objProcess = objConnection.Get("Win32_Process") intResCode = objProcess.Create("wscript.exe c:\temp\script2.vbs """ & strUser & """ """ & strPassword & """", Null, Null, intProcID) Set objProcess = Nothing Set objConnection = Nothing Set objLocator = Nothing Else WScript.Echo "Пароль - обязательный параметр" End If Else WScript.Echo "Имя - обязательный параметр" End If Пример сценария, запускаемого на контроллере домена для управления исходной станцией: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> strComputer = "ws_name" If WScript.Arguments.Count = 2 Then strUser = WScript.Arguments.Item(0) strPassword = WScript.Arguments.Item(1) Set objLocator = CreateObject("WbemScripting.SWbemLocator") Set objService = objLocator.ConnectServer(strComputer, "root\cimv2", strUser, strPassword) Set objCollection = objService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'calc.exe'") For Each objItem In objCollection objItem.Terminate Next Set objService = Nothing Set objCollection = Nothing Set objLocator = Nothing End If Ну, или (вместо WMI-локатора) пользоваться утилитой runas.exe |
Автор: mioan 30.12.07, 14:33 |
Поскажите код скрипта чтобы создать новое соединение PPPoE или VPN |
Автор: LAW 08.01.08, 12:39 |
Приветствую уважаемый Пипл!!! Отличная тема!!! Многие скрипты оказались очень полезными. У меня тут проблемка возникла... Начальство решило что имя домена, которое видно при входе в Виндовс его не устраивает и решило его поменять. Ренейм домена не проходит из-за наличия на PDC Ексченьжа. Переустанавливать всё - это последнее дело. Вот и возник интересный вопрос. Скриптом можно много чего реализовать... А нельзя ли им на логон скрине подменить название домена, что бы юзверь видел одно имя, а входил в нормальный. Вот сижу, копаю по этой теме, но пока Спасибо. |
Автор: FullArcticFox 08.01.08, 12:43 |
Версия OC? Серверной. |
Автор: LAW 08.01.08, 13:30 |
PDC,BDC cервера на Enterprise 2003, рабочии станции на XP Prof. |
Автор: AlexLine 09.01.08, 14:04 |
Смотри в сторону темы Domain Alias |
Автор: blackangel 09.01.08, 17:06 |
Дмитрий Вам ОГРОМНОЕ спасибо за идею зеркала!!! ______________________________________________ Если использовать "эффект зеркала" предложенный выше Dmitrii - сценарий на исходной станции запускает (с правам администратора домена) сценарий на контроллере домена; - сценарий, запущенный на контроллере домена, уже на исходной станции выполняет (с указанными ему привилегиями) нужную задачу. и все же...если скрипт размещен на контроллере домена, в директории \\Контроллер_домена\SYSVOL\имя_домена\Policies\{A6C2CBB..-...}\Machine\Scripts\Startup , то к нему может иметь доступ любой пользователь => узнать пароль польователя, с правами которого он запускается:( Как все же "скрыть(зашифровать)" пароль в скрипте? Пусть этот метод и не соответствует жестким правилам безопасности, но хоть как-то это можно сделать...?Кто какие варианты может предложить? Подскажите пожалуйста... Ах, да... этот метод должен работать как на ХР, так и на 2000 осях(копирование файлов CScript.exe или WScript.exe допускается). Изначальная идея VBскрипта- обновление версии антивируса DrWeb на клиентских машинах: -Скрипт прописан в групповых политиках (Computer Configuration->Windows Settings->Scripts->Startup) Краткий алгоритм скрипта: 1- Проверка установленной версии антивируса 2- Удаление старой версии антивируса(Завершение сервисов->Удаление службы->Удаление записей реестра->Удаление файлов) 3- Установка новой версии из собранного MSI пакета 4- Отправка отчета в виде текстового файла о всех удачных и не удачных действиях. Конечно, проще всего, чтоб не заморачиваться по поводу безопасности можно было бы разместить этот скрипт на сервере и автоматичекси запускать его каждые 30 минут(шейдлером или своим скриптом) для кажой включенной машины в сети,а те машины, на которых он уже запускался- исключать из списка. Но тут опять для вас вопрос Высоко Уважаемые Господа системщики и программисты! Как получить список всех машин в сети и как проверить какие доступны на данный момент? Всем кто поможет, ОГРОМНОЕ СПАСИБО...да , наверное, не только от меня, но и от всех посетителей форума, т.к. считаю эту идею скрипта актуальной:) Не подумайте что прошу написать за меня., просто до этого с VB дела не имел:( Готовый скрипт обещаю выложить в форум и не без ваших усилий;) |
Автор: Dmitrii 10.01.08, 14:56 |
Один из вариантов (с использованием ADO) уже опубликован в этой теме, в сообщении #30. Другой пример (с использованием WinNT): <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim objAD, objComputer, strCompName Const strDomane = "здесь - DNS-имя домена" Set objAD = GetObject("WinNT://" & strDomane & ",domain") objAD.Filter = Array("computer") For Each objComputer In objAD strCompName = strCompName & objComputer.Name & vbNewLine Next Set objAD = Nothing WScript.Echo strCompName Более надёжного и универсального средства, чем простое "пингование" я пока не нашёл. Может кто-нибудь другой подскажет. А вариант реализации в сценарии может быть таким (вариант для консоли): <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim objShell, objExec, objOutStream Dim strResPing, intResFind arrTest = Array("station1", "station2", "station3") 'arrTest = Array("192.168.0.1", "192.168.0.2", "192.168.0.3") Set objShell = CreateObject("WScript.Shell") For i = 0 To UBound(arrTest) Set objExec = objShell.Exec("ping -n 1 -w 300 " & arrTest(i)) Set objOutStream = objExec.StdOut strResPing = vbNullString While Not objOutStream.AtEndOfStream strResPing = strResPing & Trim(objOutStream.ReadLine()) Wend If Instr(1, strResPing, "TTL", vbTextCompare) > 1 Then WScript.Echo arrTest(i) & " -> отвечает" Else WScript.Echo arrTest(i) & " -> не отвечает" End If Next Set objOutStream = Nothing Set objExec = Nothing Set objShell = Nothing |
Автор: Blend 21.01.08, 10:03 |
Добрый день, подскажите, пожалуйста, код vbscript'a, который коннектился бы к АД под данными пользователя, от которого запускается скрипт и менял бы пароль определенного пользователя на 123456? При условии, что пользователю, из под которого запускается скрипт, уже заранее делегированы права на изменения паролей в домене, а о пользователе, которому меняют пароль, известен логин. Заранее большое спасибо за любую информацию, а если будет код для такой задачи - будет просто замечательно! |
Автор: Dmitrii 21.01.08, 10:56 |
Цитата Blend @ Один из возможных вариантов:Добрый день, подскажите, пожалуйста, код vbscript'a, который коннектился бы к АД под данными пользователя, от которого запускается скрипт и менял бы пароль определенного пользователя на 123456? При условии, что пользователю, из под которого запускается скрипт, уже заранее делегированы права на изменения паролей в домене, а о пользователе, которому меняют пароль, известен логин. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim objUser Dim strUser, strNewPswd Const strDomain = "здесь - DNS-имя домена" Const strController = "здесь - DNS-имя контроллера домена" strUser = "здесь - логин пользователя" strNewPswd = "123456" Set objUser = GetObject("WinNT://" & strDomain & "/" & strController & "/" & strUser & ",user") objUser.SetPassword strNewPswd On Error Resume Next If Err.Number <> 0 Then WScript.Echo "Ошибка " & Err.Number & vbCr & Err.Description Else WScript.Echo "Готово." End If objUser.SetInfo Set objUser = Nothing |
Автор: Maxman 21.01.08, 23:01 |
Подскажите такой VBS скрипт--запускается с флэшки-определяет тот комп или нет-копирует некоторые файлы на эту флэшку причем буква у флэшки может быть разная. |
Автор: Dmitrii 22.01.08, 05:25 |
Автоматически запускается? При каких условиях? Какое ПО будет считать его вирусом? |
Автор: Maxman 22.01.08, 11:14 |
нет нужен просто скрипт.там(на флэшке) стоит autorun который запускает bat который запускает скрипты для записи.типа Const OverwriteExisting = TRUE Set objFSO = CreateObject("Scripting.FileSystemObject") objFSO.CopyFile "z:\работа\нужн.файл.xlsx" , "f:\save\" , OverwriteExisting но надо что б комп проверяла и кидала не на f а какая буква у флэшки будет может в батнике сделать? кстати флэшка transcend с отпечатками пальцев, так вот она после проверки отпечатка автоматом запускается(в висте на хр самому надо запускать).и нод на вирус не ругается |
Автор: Dmitrii 23.01.08, 04:21 |
Определение имени диска, на котором расположен файл запущенного сценария: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> WScript.Echo Left(WScript.ScriptFullName, 1) Определение DNS-имени компьютера, на котором запущен сценарий: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Set objWsNet = CreateObject("WScript.Network") WScript.Echo objWsNet.ComputerName Set objWsNet = Nothing |
Автор: andrew307 29.01.08, 11:36 | |||||||||
Ребята, помогите, как получить в домене Win2003 имя компьютера его IP адрес имя активной учетной записи под которой залогинен пользователь и все это вывести в текстовый файл приверно в таком виде:
|
Автор: Petrov 04.02.08, 00:57 |
Доброго времени суток. Помогите скриптиком раздающим права доступа к расшаренной папке. |
Автор: avsen 05.02.08, 04:59 |
Подмогните скриптом надо прописать пользователям домена альтнрнативный DNS доп. шлюз |
Автор: Dmitrii 05.02.08, 08:19 |
Цитата andrew307 @ Вот один из возможных вариантов:... как получить в домене Win2003 имя компьютера его IP адрес имя активной учетной записи под которой залогинен пользователь и все это вывести в текстовый файл... <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim objShell, objExec, objOutStream, objWSNet Dim strTemp, strUser, strThisComputer, strIP Dim arrNames, intLBracket, intRBracket Dim objFS, objFile, strList Const strFileSpec = "C:\Temp\my_list.txt" Set objWSNet = CreateObject("WScript.Network") strThisComputer = objWSNet.ComputerName Set objWSNet = Nothing Call Computers_List(arrNames) Set objShell = CreateObject("WScript.Shell") Set objFS = CreateObject("Scripting.FileSystemObject") Set objFile = objFS.CreateTextFile(strFileSpec, True) For i = UBound(arrNames) - 1 To 0 Step -1 If StrComp(strThisComputer, arrNames(i), vbTextCompare) <> 0 Then Set objExec = objShell.Exec("ping -n 1 -w 300 " & arrNames(i)) Set objOutStream = objExec.StdOut strTemp = vbNullString While Not objOutStream.AtEndOfStream strTemp = strTemp & Trim(objOutStream.ReadLine()) Wend intLBracket = InStr(1, strTemp, "[") If intLBracket > 0 Then intRBracket = InStr(1, strTemp, "]") strIP = Mid(strTemp, intLBracket + 1, intRBracket - intLBracket - 1) If InStr(1, strTemp, "TTL", vbTextCompare) > 0 Then strUser = Logged_User(arrNames(i)) If Not IsNull(strUser) Then strList = strList & arrNames(i) & " = " & strIP & " : " & UCase(strUser) & vbNewLine Else strList = strList & arrNames(i) & " = " & strIP & " : пусто" & vbNewLine End If Else strList = strList & arrNames(i) & " = " & strIP & " : не отвечает" & vbNewLine End If End If End If WScript.Echo arrNames(i) Next objFile.Write strList objFile.Close Set objOutStream = Nothing Set objExec = Nothing Set objFile = Nothing Set objFS = Nothing Set objShell = Nothing WScript.Echo "Готово." '======= Function Computers_List(arrTemp) Dim objAD, objItem, strTemp, strList Dim strDomain, objWSNet Const strGroup = "Компьютеры домена" Set objWSNet = CreateObject("WScript.Network") strDomain = objWSNet.UserDomain Set objWSNet = Nothing Set objAD = GetObject("WinNT://" & strDomain & "/" & strGroup & ",group") For Each objItem In objAD.Members If Not objItem.AccountDisabled Then strTemp = objItem.Name strList = strList & Left(strTemp, Len(strTemp) - 1) & vbNewLine End If Next Set objAD = Nothing arrTemp = Split(strList, vbNewLine) ReDim Preserve arrTemp(UBound(arrTemp) - 1) Call Sorting_Array(arrTemp) End Function '======= Function Logged_User(strComputer) Dim objWMI, objCollection, objItem, strTemp Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set objCollection = objWMI.ExecQuery("SELECT UserName FROM Win32_ComputerSystem") For Each objItem In objCollection strTemp = objItem.UserName If Not IsNull(strTemp) Then strTemp = Mid(strTemp, InstrRev(strTemp, "\") + 1) End If Next Set objCollection = Nothing Set objWMI = Nothing Logged_User = strTemp End Function '======= Function Sorting_Array(arrTemp) Dim blnStopSort, intNumChange, strTemp blnStopSort = False i = 1 Do intNumChange = 0 For j = 0 To UBound(arrTemp) - 1 If arrTemp(j) > arrTemp(j + 1) Then strTemp = arrTemp(j) arrTemp(j) = arrTemp(j + 1) arrTemp(j + 1) = strTemp intNumChange = intNumChange + 1 End If Next If intNumChange = 0 Then blnStopSort = True Else If i < UBound(arrTemp) Then i = i + 1 Else blnStopSort = True End If End If Loop While Not blnStopSort End Function Добавлено Вгляните для начала на сообщения #3 и #11 в данной теме. |
Автор: avsen 05.02.08, 09:57 |
Извините, но мне надо альтернативный DNS, т.е. должно быть основной и альтернативный у меня нет DHCP - все ip статические |
Автор: Dmitrii 11.02.08, 07:19 |
Сценарий Change_IP_mask_DNS_Gate_by_MAC.vbs, который предложил AlexJ, легко переделывается под Ваши нужды. В самом простом случае (когда известен список DNS-имён станций, на каждой из них стоит только один сетевой адаптер, все станции доступны) сценарий может выглядеть так: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim objWMI, objCollection, objItem, intRes Dim arrComputers, arrDNSServer, arrGateway, arrGatewaymetric arrComputers = Array("station1", "station2", "station3") For i = 0 To UBound(arrComputers) Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & arrComputers(i) & "\root\cimv2") Set objCollection = objWMI.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration") arrDNSServer = Array("192.168.1.1", "192.168.1.2") arrGateway = Array("192.168.1.3", "192.168.1.4") arrGatewaymetric = Array(1, 3) For Each objItem In objCollection intRes = objItem.SetDNSServerSearchOrder(arrDNSServer) Select Case intRes Case 0 MsgBox "Список DNS-серверов настроен.", vbInformation, arrComputers(i) Case 1 MsgBox "Список DNS-серверов настроен. Требуется перезагрузка станции", vbInformation, arrComputers(i) Case Else MsgBox "При настройке списка DNS-серверов возникла ошибка " & intRes, vbCritical, arrComputers(i) End Select intRes = objItem.SetGateways(arrGateway, arrGatewaymetric) Select Case intRes Case 0 MsgBox "Список шлюзов настроен.", vbInformation, arrComputers(i) Case 1 MsgBox "Список шлюзов настроен. Требуется перезагрузка станции", vbInformation, arrComputers(i) Case Else MsgBox "При настройке списка шлюзов возникла ошибка " & intRes, vbCritical, arrComputers(i) End Select Next Next MsgBox "Готово", vbInformation Учтите, что методы SetDNSServerSearchOrder и SetGateways не добавляют новые настройки к уже имеющимся, а заменяют старые на новые. |
Автор: ANdrewZ 12.02.08, 07:34 |
Цитата AlexLine @ Скрипт меняющий пароль локального админа на всех компьютерах домена: этот скрипт нужно засунуть в стартап скрипты в ГП для компа, предварительно ессесено сздать саму ГП и применить ее для всех компьютеров домена. а может кто подскажет, что нужно добавить чтобы не пихать этот скрипт на каждую локальную машину, а прицепить его на конктретную группу в АД. И чтобы он применялся, если пользователь из этой группы логинится на любой машине в домене? Надеюсь не очень запутанно написал... Заранее спасибо:) |
Автор: Dmitrii 12.02.08, 11:23 |
ANdrewZ, в групповой политике нужного подразделения настройте политику Конфигурация пользователя - Конфигурация Windows - Сценарии. |
Автор: ANdrewZ 12.02.08, 13:29 |
да, я все так и делаю но про загрузке вот такая ошибка вываливается там где line, стоит цифра 3 |
Автор: ANdrewZ 13.02.08, 10:56 |
все, понял где была моя ошибка, я все таки не туда скрипт цеплял. Спасибо за помощь! |
Автор: Dmitrii 18.02.08, 13:53 |
Если ещё актуально, то укажите тип сети (доменная или одноранговая). |
Автор: Petrov 18.02.08, 23:39 |
Домен, Dmitrii. Нужно назначить разрешения на ДОСТУП к расшаренной папке (не перепутайте с безопастностью). |
Автор: tim01 19.02.08, 05:50 |
Привет всем, может кто может подсказать со скриптом который бы отключал учётную запись а по истечении допустим пару месяцев удалял её с AD и удалял папку с профилем с сервера??? Буду очень признателен, спасибо за раннее |
Автор: Dmitrii 19.02.08, 13:29 |
Цитата Petrov @ Не перепутал. Кстати, настройка безопасности NTFS (для объекта файловой системы) мало чем отличается от настройки разрешений на сетевой доступ.Нужно назначить разрешения на ДОСТУП к расшаренной папке (не перепутайте с безопастностью). <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '************************************************************* '* Имя: Share_Add_ACE.vbs * '* Язык: VBScript * '* Назначение: Добавление разрешений на доступ к общей папке * '************************************************************* Dim objWMI, objSecSettings, objSD, objItem, objWSNet Dim arrACE(), blnUserFound Dim objCollection, objSID, objTrustee, objNewACE Dim strComputer, strUser, strDomain, strUserSID Const FULL_ACCESS = 2032127 Const READ_AND_MODIFY = 1245631 Const READ_ONLY = 1179817 Const ACCESS_ALLOWED = 0 Const ACCESS_DENIED = 1 Const strShareName = "Total_Folder" Set objWSNet = CreateObject("WScript.Network") strComputer = objWSNet.ComputerName strDomain = objWSNet.UserDomain Set objWSNet = Nothing strUser = "здесь - имя "учётки" пользователя" Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\CIMV2") Set objCollection = objWMI.ExecQuery("SELECT * FROM Win32_LogicalShareSecuritySetting WHERE Name='" & strShareName & "'") If objCollection.Count > 0 Then Set objCollection = objWMI.ExecQuery("SELECT SID FROM Win32_Account WHERE Name='" & strUser & "' AND Domain='" & strDomain & "'") If objCollection.Count > 0 Then For Each objItem In objCollection strUserSID = objItem.SID Next Set objCollection = Nothing Set objSecSettings = objWMI.Get("Win32_LogicalShareSecuritySetting.Name='" & strShareName & "'") If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then If Not IsNull(objSD.DACL) Then ReDim arrACE(UBound(objSD.DACL)) i = 0 For Each objItem In objSD.DACL If objItem.Trustee.SIDString = strUserSID Then objItem.AccessMask = READ_ONLY blnUserFound = True Exit For Else Set arrACE(i) = objItem i = i + 1 End If Next If Not blnUserFound Then Set objSID = objWMI.Get("Win32_SID.SID='" & strUserSID & "'") Set objTrustee = objWMI.Get("Win32_Trustee").Spawninstance_() objTrustee.Domain = strDomain objTrustee.Name = strUser objTrustee.SID = objSID.BinaryRepresentation objTrustee.SidLength = objSID.SidLength objTrustee.SIDString = strUserSID Set objSID = Nothing Set objNewACE = objWMI.Get("Win32_Ace").Spawninstance_() objNewACE.AccessMask = READ_ONLY objNewACE.AceType = ACCESS_ALLOWED objNewACE.Trustee = objTrustee Set objTrustee = Nothing i = UBound(arrACE) + 1 ReDim Preserve arrACE(i) Set arrACE(i) = objNewACE objSD.DACL = arrACE Set objNewACE = Nothing Erase arrACE End If intResult = objSecSettings.SetSecurityDescriptor(objSD) Select Case intResult Case 0: WScript.Echo "Успешное завершение." Case 2: WScript.Echo "Отсутствует доступ к необходимой информации." Case 8: WScript.Echo "Неизвестная ошибка." Case 9: WScript.Echo "Для выполнения операции нет достаточных прав." Case 21: WScript.Echo "Заданы недопустимые значения параметров." End Select Else WScript.Echo "Дескриптор безопасности объекта не содержит ни одной записи DACL." End If Else WScript.Echo "Не удалось прочитать дескриптор безопасности объекта." End If Else WScript.Echo "Не обнаружена учётная запись пользователя " & UCase(strUser) End If Else WScript.Echo "Не обнаружен общий ресурс с именем " & UCase(strShareName) End If Set objSD = Nothing Set objSecSettings = Nothing Set objWMI = Nothing <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '*********************************************************** '* Имя: Share_Remove_ACE.vbs * '* Язык: VBScript * '* Назначение: Удаление разрешений на доступ к общей папке * '*********************************************************** Dim objWMI, objSecSettings, objSD, objItem, objWSNet, objCollection Dim arrACE(), blnUserFound Dim strComputer, strUser, strDomain, strUserSID Const strShareName = "Total_Folder" Set objWSNet = CreateObject("WScript.Network") strComputer = objWSNet.ComputerName strDomain = objWSNet.UserDomain Set objWSNet = Nothing strUser = "здесь - имя "учётки" пользователя" Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\CIMV2") Set objCollection = objWMI.ExecQuery("SELECT * FROM Win32_LogicalShareSecuritySetting WHERE Name='" & strShareName & "'") If objCollection.Count > 0 Then Set objCollection = objWMI.ExecQuery("SELECT SID FROM Win32_Account WHERE Name='" & strUser & "' AND Domain='" & strDomain & "'") If objCollection.Count > 0 Then For Each objItem In objCollection strUserSID = objItem.SID Next Set objCollection = Nothing Set objSecSettings = objWMI.Get("Win32_LogicalShareSecuritySetting.Name='" & strShareName & "'") If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then If Not IsNull(objSD.DACL) Then ReDim arrACE(UBound(objSD.DACL)) i = 0 For Each objItem In objSD.DACL If StrComp(objItem.Trustee.SIDString, strUserSID, vbTextCompare) <> 0 Then Set arrACE(i) = objItem i = i + 1 Else blnUserFound = True End If Next If blnUserFound Then i = UBound(arrACE) - 1 ReDim Preserve arrACE(i) objSD.DACL = arrACE Erase arrACE End If intResult = objSecSettings.SetSecurityDescriptor(objSD) Select Case intResult Case 0: WScript.Echo "Успешное завершение." Case 2: WScript.Echo "Отсутствует доступ к необходимой информации." Case 8: WScript.Echo "Неизвестная ошибка." Case 9: WScript.Echo "Для выполнения операции нет достаточных прав." Case 21: WScript.Echo "Заданы недопустимые значения параметров." End Select Else WScript.Echo "Дескриптор безопасности объекта не содержит ни одной записи DACL." End If Else WScript.Echo "Не удалось прочитать дескриптор безопасности объекта." End If Else WScript.Echo "Не обнаружена учётная запись пользователя " & UCase(strUser) End If Else WScript.Echo "Не обнаружен общий ресурс с именем " & UCase(strShareName) End If Set objSD = Nothing Set objSecSettings = Nothing Set objWMI = Nothing Примечания: 1. Предполагается, что сценарии будут запускаться на той же станции, где расположен управляемый ресурс. 2. Работоспособность сценариев проверена на Windows 2000 Pro/XP Pro/2003. 3. В принципе, для решения задачи можно воспользоваться не WMI, а ADSI. Добавлено Смотрите сообщение #5 данной темы. Один из вариантов: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim objContainer, strUser, strPath On Error Resume Next strUser = "Кладовщик" strPath = "LDAP://ou=Пользователи,ou=Склад,dc=domain_name,dc=ru" Set objContainer = GetObject(strPath) If Err.Number = 0 Then Call objContainer.Delete("user", "cn=" & strUser) If Err.Number = 0 Then WScript.Echo "Готово" Else WScript.Echo Err.Number & vbCr & Err.Description Err.Clear End If Else WScript.Echo Err.Number & vbCr & Err.Description Err.Clear End If Set objContainer = Nothing |
Автор: tim01 20.02.08, 05:53 |
Привет всем, может кто может подсказать со скриптом который бы отключал учётную запись а по истечении допустим пару месяцев удалял её с AD и удалял папку с профилем с сервера??? Буду очень признателен, спасибо за раннее. А полностью не можете скриптик, а то я что то не понимаю как ко времяни привязать Добавлено Ой простите, мне что бы удалялись учётки которые отключены уже два месяца в AD и удалялся профиль с документ сетингс вместе с аккаунтом |
Автор: Petrov 21.02.08, 00:21 |
Dmitrii Настройка безопастности NFS и настройка сетевого доступа в расшаренный ресурс не одно и тоже. К примеру. Назначим полный доступ в папку "С:\Общая" для группы "Users". Назначим в безопасности для папки "C:\Общая" полный доступ для группы "Managers" И в итоге пользователь не входящий в группу "Users" но входящий в группу "Managers" НЕ ПОЛУЧИТ доступ к папке из сети. з.ы. Скрипт не работет. Ошибки валятся. |
Автор: Dmitrii 21.02.08, 05:04 |
Цитата Petrov @ Во-первых, я и не утверждал, что это ОДНО И ТО ЖЕ. Было сказано: "... мало чем отличается".Настройка безопастности NFS и настройка сетевого доступа в расшаренный ресурс не одно и тоже... Во-вторых, речь шла не о функциональности этих средств администрирования, а о процедуре настройки дескриптора безопасности. Наконец, Вы всерьёз полагаете, что берясь на написание сценариев для системного администрирования, я не имею представления о том, чем собираюсь управлять? Какие именно? "Пробежаться" по сценарию отладчиком пробовали? Если пробовали, то где именно возникает первая ошибка. |
Автор: Petrov 21.02.08, 05:10 |
Дайте ссылочку где отадчик забрать. Плизз. |
Автор: Dmitrii 21.02.08, 06:10 |
Если у Вас есть MS Office, то Вы уже имеете хорошее средство разработки VB-сценариев - это редактор VBA. В тексте сценария замените все выражения WScript.Echo на MsgBox. В начало сценария добавьте выражение типа Sub Test(), а в конец - End Sub. Затем выполните импорт сценария в редактор. Если интересуют специализированные средства разработки сценариев, то рекомендую Primalscript компании Sapien, но он платный (ознакомительный период - 45 дней): http://www.primalscript.com/ Хороших бесплатных инструментов мне пока не попадалось. |
Автор: Petrov 21.02.08, 23:41 |
БЛАГОДАРЮ. Будет время свободное, разберусь что и как. |
Автор: Petrov 22.02.08, 00:49 |
Вот тут останавливается <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> If objCollection.Count > 0 Then Говорит не допустимый запрос. имя папки и группы указаны верно. Папка расшарена. |
Автор: Dmitrii 22.02.08, 13:45 |
Такое выражение в сценарии встречается дважды. О котором речь? Если изменяли код сценария, то выложите, пожалуйста, свой вариант. Добавлено Цитата tim01 @ Особого свойства, хранящего дату отключения "учётки", вроде бы нет. Однако, если с момента отключения никакие свойства отключенной "учётки" не изменялись, то можно воспользоваться свойством WhenChanged. Реализовать это можно как-нибудь так:Ой простите, мне что бы удалялись учётки которые отключены уже два месяца в AD и удалялся профиль с документ сетингс вместе с аккаунтом <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim objRootDSE, objGroup, objItem Dim strTemp, arrTemp Const strGroup = "здесь - имя проверяемого объекта типа ГРУППА" Const strUnit = "здесь - имя проверяемого объекта типа ПОДРАЗДЕЛЕИЕ, в котором находится группа" On Error Resume Next Set objRootDSE = GetObject("LDAP://rootDSE") If Err.Number = 0 Then Set objGroup = GetObject("LDAP://cn=" & strGroup & ",ou=" & strUnit & "," & objRootDSE.Get("defaultNamingContext")) If Err.Number = 0 Then i = 0 For Each objItem In objGroup.Members If objItem.AccountDisabled Then i = i + 1 userAnswewr = MsgBox("Учётная запись " & UCase(objItem.cn) & " отключена в течение " & _ DateDiff("m", DateValue(objItem.WhenChanged), Date) & " мес." & _ vbCr & "Удалить?", vbYesNo + vbQuestion) If userAnswewr = vbYes Then arrTemp = Split(objRootDSE.Get("defaultNamingContext"), ",") strTemp = Right(arrTemp(0), Len(arrTemp(0)) - 3) MsgBox Del_Account(objItem.cn, objItem.ProfilePath, strTemp) End If End If Next Set objGroup = Nothing If i = 0 Then MsgBox "В группе " & UCase(strGroup) & " отключенных учётных записей не обнаружено." End If Else MsgBox "Не удалось получить доступ к объекту " & UCase(strGroup) & vbCr & Err.Description Err.Clear End If Else MsgBox "Не удалось получить доступ к корню Active Directory" & vbCr & Err.Description Err.Clear End If Set objRootDSE = Nothing '=== Function Del_Account(strUser, strPath, strDomain) Dim objComputer, strReport, objFS Const strDomController = "здесь - DNS-имя контроллера домена" On Error Resume Next Set objFS = CreateObject("Scripting.FileSystemObject") If objFS.FolderExists(strPath) Then objFS.DeleteFolder strPath, True If Err.Number = 0 Then strReport = "Папка профиля удалена." Else strReport = "Папка профиля не удалена." & vbCr & Err.Description Err.Clear End If Else strReport = "Папка профиля не обнаружена." End If Set objFS = Nothing Set objComputer = GetObject("WinNT://" & strDomain & "/" & strDomController) If Err.Number = 0 Then Call objComputer.Delete("user", strUser) If Err.Number = 0 Then strReport = strReport & vbCr & vbCr & "Учётная запись удалена." Else strReport = strReport & vbCr & vbCr & "Учётная запись не удалена." & vbCr & Err.Description Err.Clear End If Else strReport = strReport & vbCr & vbCr & "Cвязь с контроллером домена не установлена." & vbCr & Err.Description End If Set objComputer = Nothing Del_Account = strReport End Function |
Автор: katerinka 27.02.08, 07:28 |
Привет! может кто-нибудь подсказать со скриптом, который определял бы количество на печатанных пользователями страниц в месяц. Результатом выполнения задачи является информация о количестве страниц напечатанных каждым пользователем. Спасибо заранее. |
Автор: ^D^ima 04.03.08, 12:23 |
Подскажите скрипт для резолвинга IP адресов. Очень нужно. |
Автор: leftfield 05.03.08, 08:45 |
Туплю..ууу- не могу! На удаленном компе есть расшарен.папка А,в ней обычная папка В .Как снять наследование у папки В от папки А скриптом? Заранее признателен!(Третий день уже сижу...) Это сообщение было перенесено сюда или объединено из темы "Как отключить наследование у вложенной папки на удаленном PC" |
Автор: Dmitrii 05.03.08, 14:39 |
Цитата katerinka @ Вообще-то такую задачу лучше решать, исходя из конкретной ситуации в Вашей сети. Пока могу предложить сценарий для самого простого случая:может кто-нибудь подсказать со скриптом, который определял бы количество на печатанных пользователями страниц в месяц. Результатом выполнения задачи является информация о количестве страниц напечатанных каждым пользователем - к некоей сетевой станции подключен принтер общего доступа; - пользователь, запускающий сценарий, имеет права администратора на этой станции; - для сбора указанных сведений анализируется журнал системных событий этой станции; - период очистки журнала совпадает с периодом сбора сведений, причём очистка выполняется только после выполнения рассматриваемой задачи. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim objWMI, objCollection, objItem, lngNumEvents Dim strMsg, intPosL, intPosR, strOwner, intPages Dim dtmEventDate, dtmFirstDate, dtmLastDate Dim objDict, objFS, objFile Const strComputer = "здесь - DNS-имя станции, журнал которой анализируется" Const strResFile = "C:\Temp\Results.txt" dtmFirstDate = DateValue("01.02.2008") dtmLastDate = DateValue("29.02.2008") Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set objCollection = objWMI.ExecQuery("SELECT * FROM Win32_NTLogEvent WHERE Logfile='System' " & _ "AND EventType=3 AND SourceName='Print' AND EventCode=10") lngNumEvents = objCollection.Count If lngNumEvents > 0 Then Wscript.Echo "Найдено событий указанного вида: " & lngNumEvents Set objDict = CreateObject("Scripting.Dictionary") objDict.CompareMode = 1 For Each objItem In objCollection dtmEventDate = Date_Convert(CStr(objItem.TimeWritten)) If dtmFirstDate <= dtmEventDate And dtmEventDate <= dtmLastDate Then strMsg = objItem.Message intPosL = InStr(1, strMsg, "владельца", vbTextCompare) intPosR = InStr(1, strMsg, "напечатан", vbTextCompare) strOwner = Mid(strMsg, intPosL + 10, intPosR - intPosL - 11) intPosL = InStrRev(strMsg, ":") intPages = CInt(Mid(strMsg, intPosL + 2)) If objDict.Exists(strOwner) Then objDict.Item(strOwner) = objDict.Item(strOwner) + intPages Else objDict.Add strOwner, intPages End If End If Next Set objFS = CreateObject("Scripting.FileSystemObject") Set objFile = objFS.CreateTextFile(strResFile, True) For Each objItem In objDict.Keys objFile.WriteLine (objItem & " = " & objDict.Item(objItem)) Next objFile.Close Set objFile = Nothing objDict.RemoveAll Set objDict = Nothing Wscript.Echo "Готово." Else Wscript.Echo "Событий указанного вида в журнале не обнаружено." End If Set objCollection = Nothing Set objWMI = Nothing '=== Function Date_Convert(strDTM) Date_Convert = DateValue(Mid(strDTM, 7, 2) & "." & Mid(strDTM, 5, 2) & "." & Mid(strDTM, 1, 4)) End Function Если Ваш случай сложнее, то опишите, пожалуйста, исходные условия задачи. Цитата ^D^ima Ваша задача сформулирована слишком лаконично. Подскажите скрипт для резолвинга IP адресов |
Автор: Dmitrii 06.03.08, 07:50 |
Цитата leftfield @ Попробуйте так:На удаленном компе есть расшарен.папка А,в ней обычная папка В .Как снять наследование у папки В от папки А скриптом? <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim objWMI, objSecSettings, objSD, objFS, intResult Const SE_DACL_PROTECTED = 4096 Const strPath = "здесь - путь к целевой папке в обычном формате" Const strPathWMI = "здесь - путь к целевой папке в формате для WMI, т.е. с удвоенным кол-вом символов '\'" Set objFS = CreateObject("Scripting.FileSystemObject") If objFS.FolderExists(strPath) Then Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2") Set objSecSettings = objWMI.Get("Win32_LogicalFileSecuritySetting.Path='" & strPathWMI & "'") If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then If CBool(objSD.ControlFlags And SE_DACL_PROTECTED) Then intResult = -1 Else objSD.ControlFlags = objSD.ControlFlags + SE_DACL_PROTECTED intResult = objSecSettings.SetSecurityDescriptor(objSD) End If Select Case intResult Case -1: WScript.Echo "Наследование уже отключено." Case 0: WScript.Echo "Успешное завершение." Case 2: WScript.Echo "Отсутствует доступ к необходимой информации." Case 9: WScript.Echo "Для выполнения операции нет достаточных прав." Case 21: WScript.Echo "Заданы недопустимые значения параметров." Case Else: WScript.Echo "Неизвестная ошибка." End Select Else WScript.Echo "Не удалось прочитать дескриптор безопасности объекта." End If Set objSD = Nothing Set objSecSettings = Nothing Set objWMI = Nothing Else WScript.Echo "Указанный объект не обнаружен." End If |
Автор: ^D^ima 06.03.08, 11:51 |
Имеется список IP адресов(например в текстовом файле), необходимо их разрешить до DNS имени. Что не понятно? |
Автор: shur_a1981 27.03.08, 09:16 |
[QUOTE=Dmitrii,1202199554,1857889][quote=andrew307,1201606583,1850781]... как получить в домене Win2003 имя компьютера его IP адрес имя активной учетной записи под которой залогинен пользователь и все это вывести в текстовый файл...[/quote]Вот один из возможных вариантов: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim objShell, objExec, objOutStream, objWSNet Dim strTemp, strUser, strThisComputer, strIP Dim arrNames, intLBracket, intRBracket Dim objFS, objFile, strList Const strFileSpec = "C:\Temp\my_list.txt" Set objWSNet = CreateObject("WScript.Network") strThisComputer = objWSNet.ComputerName Set objWSNet = Nothing Call Comuters_List(arrNames) Set objShell = CreateObject("WScript.Shell") Set objFS = CreateObject("Scripting.FileSystemObject") Set objFile = objFS.CreateTextFile(strFileSpec, True) For i = UBound(arrNames) - 1 To 0 Step -1 If StrComp(strThisComputer, arrNames(i), vbTextCompare) <> 0 Then Set objExec = objShell.Exec("ping -n 1 -w 300 " & arrNames(i)) Set objOutStream = objExec.StdOut strTemp = vbNullString While Not objOutStream.AtEndOfStream strTemp = strTemp & Trim(objOutStream.ReadLine()) Wend intLBracket = InStr(1, strTemp, "[") If intLBracket > 0 Then intRBracket = InStr(1, strTemp, "]") strIP = Mid(strTemp, intLBracket + 1, intRBracket - intLBracket - 1) If InStr(1, strTemp, "TTL", vbTextCompare) > 0 Then strUser = Logged_User(arrNames(i)) If Not IsNull(strUser) Then strList = strList & arrNames(i) & " = " & strIP & " : " & UCase(strUser) & vbNewLine Else strList = strList & arrNames(i) & " = " & strIP & " : пусто" & vbNewLine End If Else strList = strList & arrNames(i) & " = " & strIP & " : не отвечает" & vbNewLine End If End If End If WScript.Echo arrNames(i) Next objFile.Write strList objFile.Close Set objOutStream = Nothing Set objExec = Nothing Set objFile = Nothing Set objFS = Nothing Set objShell = Nothing WScript.Echo "Готово." '======= Function Comuters_List(arrTemp) Dim objAD, objComputer, strTemp, strList Const strDomane = "здесь - DNS-имя домена" Const strGroup = "Компьютеры домена" Set objAD = GetObject("WinNT://" & strDomane & "/" & strGroup & ",group") For Each objItem In objAD.Members If Not objItem.AccountDisabled Then strTemp = objItem.Name strList = strList & Left(strTemp, Len(strTemp) - 1) & vbNewLine End If Next Set objAD = Nothing arrTemp = Split(strList, vbNewLine) Call Sorting_Array(arrTemp) End Function '======= Function Logged_User(strComputer) Dim objWMI, objCollection, objItem, strTemp Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set objCollection = objWMI.ExecQuery("SELECT UserName FROM Win32_ComputerSystem") For Each objItem In objCollection strTemp = objItem.UserName If Not IsNull(strTemp) Then strTemp = Mid(strTemp, InstrRev(strTemp, "\") + 1) End If Next Set objCollection = Nothing Set objWMI = Nothing Logged_User = strTemp End Function '======= Function Sorting_Array(arrTemp) Dim blnStopSort, intNumChange, strTemp blnStopSort = False i = 1 Do intNumChange = 0 For j = 0 To UBound(arrTemp) - 1 If arrTemp(j) < arrTemp(j + 1) Then strTemp = arrTemp(j) arrTemp(j) = arrTemp(j + 1) arrTemp(j + 1) = strTemp intNumChange = intNumChange + 1 End If Next If intNumChange = 0 Then blnStopSort = True Else If i < UBound(arrTemp) Then i = i + 1 Else blnStopSort = True End If End If Loop While Not blnStopSort End Function Добрый день Какие службы на удаленном компьютере должны быть запущены чтобы функция 'GetObject("winmgmts:".......' работала? В Вашем скрипте. А то некоторые компы дают инфу по пользователю, некоторые вываливаются с ошибкой "Компьютер удаленного сервера не существует или недоступен.GetObject. Код 800А01СE" Причем комп пингуется! Компьютеры в домене Win200 SP4 WinXP SP2 |
Автор: Dmitrii 28.03.08, 05:04 |
Цитата shur_a1981 @ Служба "Инструментарий управления Windows".Какие службы на удаленном компьютере должны быть запущены чтобы функция 'GetObject("winmgmts:".......' работала? Однако причиной такой ошибки может быть ещё и некорректная работа DNS-сервера. В качестве проверки этого предположения предлагаю заменить DNS-имена на IP-адреса. |
Автор: ZOLDATO 31.03.08, 09:28 |
День добрый всем! Такое дело: имеются работающие скрипты (все из "MS Script Center Ver 3.0") для изменения на компах ДНС-сервера (чтобы позднее ввести их в новый домен), вывода из старого домена, ввода в новый домен. Вопрос 1: Как запустить эти три скрипта с одной машины на всех других не копируя вручную скрипты на компы, и не запуская их по очереди вручную же? Вопрос 2: Может быть есть способ не перегружать машине между скриптами вывода из домена - и ввода в новый домен (другие скрипты?)? Вопрос 3: "strComputer" - параметр в скриптах для подключения к удаленным компьютерам использует только имена? (у меня по IP не заработали скрипты). |
Автор: kuhnsn 19.05.08, 07:20 |
Здравствуйте! я новичок на этом форуме, меня зовут Сергей. я далеко не профи, обучаюсь потихоньку. вот одна из проблемок, с которой столкнулся. Необходимо ввести в домен Win2003 несколько компьютеров, компов около 50, хотелось бы свести к минимуму затраченное на это время. Вижу себе это с помощью скрипта, который планируется запустить на машине, который бы автоматически ввел ее в домен. Умные книжки предлагают это сделать все в слудеющем виде (недостатки очевидны, необлходимо вводить имя компа для каждого, а нужно чтобы он брал эту инфу сам, т.е. результат такой д.б., запускаем скрипт на любом компе, подлюченном к локалке, после отработки скрипта он в домене, ребутаем и все. учетки польхзователей уже созданы, т.е. регить их не нужно): <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> 'Этот код присоединяет компьютер к домену. 'Работает только под Windows XP, 2003. '------КОНФИГУРАЦИЯ СЦЕНАРИЯ------ strComputer = "<comp_1>" strDomain = "<domain_name>" strDomainUser = "<Administrator>" strDomainPasswd = "<admin_password>" strLocalUser = "<local_user_name>" strLocalPasswd = "<local_user_password>" '------КОНЕЦ КОНФИГУРАЦИИ------ '######################## 'Константы '######################## Const JOIN_DOMAIN = 1 Const ACCT_CREATE = 2 Const ACCT_DELETE = 4 Const WIN9X_UPGRADE = 16 Const DOMAIN_JOIN_IF_JOIND = 32 Const JOIN_UNSECURE = 64 Const MACHINE_PASSWORD_PASSED = 128 Const DEFERRED_SPN_SET = 256 Const INSTALL_INVOCATION = 262144 '######################## 'Подключение к компьютеру '######################## set objWMILocator = CreateObject("WbemScripting.SWbemLocator") objWMILocator.Security_.AuthenticationLevel = 6 set objWMIComputer = objWMILocator.ConnectServer(strComputer, _ "root\cimv2", _ strLocalUser, _ strLocalPasswd) set objWMIComputerSystem = objWMIComputer.Get( _ "Win32_ComputerSystem.Name='" & _ strComputer & "'") '############################### 'Подключение компьютера к домену '############################### rc = objWMIComputerSystem.JoinDomainOrWorkGroup(strDomain, _ strDomainPasswd, _ strDomainUser, _ vbNullString, _ JOIN_DOMAIN) if rc <> 0 then WScript.Echo "Join failed with error: " & rc else WScript.Echo "Successfully joined " & strComputer & " to " & strDomain end if |
Автор: se_ma 29.05.08, 05:41 |
Доброе время суток! Подскажите, как задать сетевому адаптеру 2-а IP адреса? Есть список из двух адресов, задаётся только один. |
Автор: kuhnsn 30.05.08, 08:57 |
какая операционка? |
Автор: AlexJ 30.05.08, 19:30 |
Воспользоваться поиском или хотя бы дочитать первую страницу этой темы , где в 3-м посте есть решение. |
Автор: Ixtiander 31.05.08, 06:09 |
А как скриптом просканировать все вложенные папки и вытащить у них информацию "security"? |
Автор: Dmitrii 02.06.08, 03:51 |
Посмотрите сообщение #21, сценарий Check_File_SecuritySetting, этой темы. Используйте рекурсию. |
Автор: Ixtiander 02.06.08, 05:22 |
Не работает под Win 2003 server |
Автор: Dmitrii 02.06.08, 08:33 |
Этот сценарий использовался под Windows Server 2003 неоднократно. В чём именно выражается его неработоспособность в Вашем случае? |
Автор: Ixtiander 02.06.08, 08:36 |
line 36 char 1 error not found code 80041002 source SwbemServicesEx |
Автор: Dmitrii 02.06.08, 10:48 |
Причина - на диске С: отсутствует папка Temp. |
Автор: Ixtiander 02.06.08, 10:54 |
Так. Заработало, но пишет Запись DACL для заданного пользователя не обнаружена. |
Автор: Dmitrii 02.06.08, 11:15 |
Ixtiander, обратите внимание на то, что этот пример предназначен для чтения той части содержимого дескриптора безопасности, которая касается ТЕКУЩЕГО пользователя. Чтобы изменить эту ситуацию в качестве значения переменной usrName задайте имя нужного пользователя. |
Автор: Pit-Bul 11.06.08, 05:08 |
kuhnsn, в какой умной книжке ты читал про этот скрипт. Просто попробовал попользоваться им, но вылетает ошибка "Не доступен сервер RPC" в строке <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> set objWMIComputer = objWMILocator.ConnectServer(strComputer, _ "root\cimv2", _ strLocalUser, _ strLocalPasswd) непонятен параметр "root\cimv2" , может еще кто подскажет в чем проблема система ХР домен Win2003 Добавлено еще заметил такую закономерность, эта ошибка возникает во всех скриптах где указан этот параметр для разных методов |
Автор: Romtek 13.06.08, 20:39 |
Нужен скрипт, который пройдёт по всем пользователям домена (Windows 2000 Server) и определит имеющиеся Network Drive Maps у каждого подключённого пользователя (включая диски NetWare). <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Computer: <computer_name> User: <logon_name> Network Drive Mappings: X: \\Comp1\share ... |
Автор: kuhnsn 16.06.08, 05:59 |
книжки: Робби Аллен, Престон Гралла, «Windows XP. Сборник рецептов». Издательство Питер, 2007 г., ISBN 5-469-01260-3 Робби Аллен, «Windows Server 2000/2003. Рецепты администрирования». Издательство Русская редакция, М. 2006, ISBN 5-7502-0273-9 Считаю, что решение этой проблемки поможет многим начинающим админам. |
Автор: Romtek 16.06.08, 10:48 |
Очень ценный совет, спасибо. И всё же тема у нас про скрипты, а не книги. |
Автор: Dmitrii 16.06.08, 12:27 |
Пример аналогичного по сути сценария можно найти в TechNet Script Center (см. ссылку в сообщении #38 этой темы). Цитата Romtek @ Наиболее вероятны две причины:... Просто попробовал попользоваться им, но вылетает ошибка "Не доступен сервер RPC" в строке... - неверно указаны имя и (или) пароль локального администратора присоединяемого к домену узла; - локальному администратору, учётные данные которого указаны в сценарии (или всей группе локальных администраторов), запрещено обращение к пространству имён CIMV2. Одно из пространств имён (иначе - одна из групп классов) репозитория (хранилища) классов и объектов. Цитата Pit-Bul @ Загляните в настройки безопасности для пространства CIMV2: Управление компьютером - Службы и приложения - Управляющий элемент WMI - Свойства - Безопасность. ... заметил такую закономерность, эта ошибка возникает во всех скриптах где указан этот параметр для разных методов... |
Автор: nalek 16.06.08, 14:17 |
Цитата Romtek @ Нужен скрипт, который пройдёт по всем пользователям домена (Windows 2000 Server) и определит имеющиеся Network Drive Maps у каждого подключённого пользователя (включая диски NetWare). Можно повесить скрипт в групповые политики домена, "на логон" пользователя, и он будет отрабатывать когда пользователь будет входить в систему: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> var objNet = WScript.CreateObject("WScript.Network"); // имя пользователя var vUsername = objNet.UserName; // имя компьютера var vComputername = objNet.ComputerName; // буффер в который будем собирать инфу о сетевых дисках var vNetDrives = ""; // получаем "коллекцию" имен сетевых дисков и сетевых путей var vDrivesArr = objNet.EnumNetworkDrives(); // циклически перебираем "коллекцию"(массив); сначала идет буква сетевого диска, следующий эл-т массива это сетевой путь for( var i =0; i <vDrivesArr.Count(); i =i+2) { vNetDrives += vDrivesArr.Item(i) /*буква диска*/ + " (" + vDrivesArr.Item(++i) /*сетевой путь*/ + ")\r\n"; } // далее можно сохранять результаты в файл и т.д. Если же все-таки необходимо "пройтись" по всем сразу, то в голову приходит только одно: экспортировать из AD объекты типа "компьютер", далее на каждом запускать, удаленно, с помощью объекта "WshController" ( тут или тут) вышеописанный скрипт. |
Автор: Pit-Bul 16.06.08, 15:43 |
Dmitrii, спасибо Цитата Dmitrii @ Загляните в настройки безопасности для пространства CIMV2: Управление компьютером - Службы и приложения - Управляющий элемент WMI - Свойства - Безопасность. вот это понятно, но не понятно где эти разрешения давать, на локальной машине или контроллере домена. Если на локальной машине то смысл скрипта отпадает, все равно придется лезть руками и везде давать доступ (если конечно нельзя подкорректировать скрипт чтобы он сам открывал эти разрешения ), но а если на контроллере домена то все хорошо. |
Автор: Romtek 17.06.08, 05:07 |
Цитата Dmitrii @ Цитата (Romtek @ 13.06.08, 22:39) kuhnsn, в какой умной книжке ты читал про этот скрипт... Пример аналогичного по сути сценария можно найти в TechNet Script Center (см. ссылку в сообщении #38 этой темы). Цитата (Romtek @ 13.06.08, 22:39) ... Просто попробовал попользоваться им, но вылетает ошибка "Не доступен сервер RPC" в строке... Наиболее вероятны две причины: - неверно указаны имя и (или) пароль локального администратора присоединяемого к домену узла; - локальному администратору, учётные данные которого указаны в сценарии (или всей группе локальных администраторов), запрещено обращение к пространству имён CIMV2. Я такого не писал. Цитировать надо было Pit-Bul! Воспользовавшись приведённым материалом, не нашёл среди скриптов ничего похожего. У меня возникла идея написать скрипт, который будет выполняться во время login на сервере... |
Автор: Dmitrii 17.06.08, 13:29 |
"Проморгал", приношу свои извинения. Искали по ключу JoinDomainOrWorkGroup? Например, в справочнике "The Portable Script Center, Version 3.0, November 2004" сценарий присоединения узла к домену находится в разделе Active Directory - Computer Accounts и называется Join a Computer to a Domain. Цитата Romtek @ А подробнее.У меня возникла идея написать скрипт, который будет выполняться во время login на сервере... На том компьютере, к WMI-пространству которого выполняется подключение. Цитата Pit-Bul @ Не обязательно. Достаточно либо запускать сценарий из-под привилегированной (в обсуждаемом отношении) учётной записи, либо подключаться к нужному пространству с помощью WMI-локатора, используя учётные данные привилегированного пользователя уже непосредствено в сценарии. ...Если на локальной машине то смысл скрипта отпадает, все равно придется лезть руками и везде давать доступ... |
Автор: Dark-Dragon 20.06.08, 05:53 |
Помогите пожалуйста!!! Нужен скрипт который бы на всех ПК переименовывал бы учетку администратора и менял его пароль. У меня на всех ПК в сетке разные имена локальных админов, хочется, как то это все автоматически переименовать в одно имя и поменять пароль. Заранее благодарю! |
Автор: Romtek 20.06.08, 09:59 |
Цитата Dmitrii @ Искали по ключу JoinDomainOrWorkGroup? Например, в справочнике "The Portable Script Center, Version 3.0, November 2004" сценарий присоединения узла к домену находится в разделе Active Directory - Computer Accounts и называется Join a Computer to a Domain. Это не то. Сетевой вход в систему (Net Logon). При этом у всех пользователей запускается заданный скрипт. Правда, мне нужно, чтобы скрипт выполнялся только для Workstation Member домена. Кое-что уже накопал, буду пробовать понемногу. Добавлено Цитата Dark-Dragon @ У меня на всех ПК в сетке разные имена локальных админов, хочется, как то это все автоматически переименовать в одно имя и поменять пароль. Перед тем, как что-либо менять, есть несколько вопросов: |
Автор: Dark-Dragon 25.06.08, 05:19 |
Полномочия такие есть, сеть - Домен. |
Автор: Dmitrii 25.06.08, 06:59 |
Цитата Dark-Dragon @ Если речь идёт о встроенной учётной записи "Администратор" и нет возражений против того, чтобы "учётка" администратора домена именовалась так же, как и "учётка" локального администратора, то можно обойтись без сценариев. Смотрите групповую политику: Конфигурация компьютера - Конфигурация Windows - Параметры безопасности - Локальные политики - Параметры безопасности - политика "Учётные записи: переименование учётной записи администратора".У меня на всех ПК в сетке разные имена локальных админов, хочется, как то это все автоматически переименовать в одно имя... Смотрите первый сценарий в сообщении #1 этой темы. |
Автор: nalek 29.06.08, 11:22 |
Привет всем! Подскажите пжалста, как узнать major, minor версию windows, а так же информацию об установленных сервиспаках. Спасибо. |
Автор: Dmitrii 30.06.08, 05:12 |
Цитата nalek @ ...как узнать major, minor версию windows, а так же информацию об установленных сервиспаках. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim objWMI, objCollection, objItem Set objWMI = GetObject("winmgmts:{impersonationlevel=impersonate}!\\.\root\cimv2") Set objCollection = objWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem") For Each objItem In objCollection WScript.Echo "Версия ОС: " & objItem.Version & vbNewLine & _ "Пакет обновления: " & objItem.ServicePackMajorVersion & "." & _ objItem.ServicePackMinorVersion Next Set objCollection = Nothing Set objWMI = Nothing |
Автор: Cechmanek 08.07.08, 06:30 |
Подскажите, как можно написать скрипт который будет менять переменные окружениния в консоли ? Я вот например хочу запустить консоль, в ней скрипт и чтобы в консоли изменилась переменная окружения path, и там было бы только то что я добавил, а все остальное (то что по дефолтну настроено) было удалено, естественно чтобы это выполнялось только для этой консоли, в который скрипт запущен. |
Автор: Bugavka 14.07.08, 06:59 |
Помогите уточнить критерий. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Sub AddGroup (Domain, Login) On Error Resume Next Set objDomain = GetObject("WinNT://" & Domain) For Each ObjGroup In objDomain If ObjGroup.class = "Group" Then strGroup = strGroup & ObjGroup.name & ";" End If Next Msgbox strGroup Много групп вываливается. Какие есть критерии для отбора, и как в кде их указать? |
Автор: Dmitrii 15.07.08, 04:51 |
Свойства объекта типа ГРУППА, например. Если не знаете списка свойств, то загляните в MSDN: http://msdn.microsoft.com/en-us/library/aa706021.aspx Всё зависит от того, что именно нужно выбрать. |
Автор: Bugavka 15.07.08, 07:15 |
Не нашел мне нужно отобрать по Group Scope и Group Type, нужны global and security. |
Автор: Bugavka 15.07.08, 08:21 |
Нашел ObjGroup.get("groupType") ' Constants taken from ADS_GROUP_TYPE_ENUM ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP = 4 ADS_GROUP_TYPE_GLOBAL_GROUP = 2 ADS_GROUP_TYPE_LOCAL_GROUP = 4 ADS_GROUP_TYPE_SECURITY_ENABLED = -2147483648 ADS_GROUP_TYPE_UNIVERSAL_GROUP = 8 то есть если проверять по 2 то выводит только Глобальные а Секьюрити не нашел. Но судя по апплету AD users and computers не сильно оно и поможет, так как тип одинаковый у нужных групп и "ненужных" |
Автор: vfksi 21.07.08, 02:42 |
помогите со скриптом пожалуйста... есть список програм его нужно добавить в "политики ограниченного использования программ" маска по пути... можно в текстовик создать либо экспортировать с тестовой машинки... может тут даже скрипт не нужен, просто в меню пункт экспорт есть, а как импотировать его так и не нашёл... гугл не помог, возможно просто запросы не те делал ( |
Автор: MIF 24.07.08, 09:52 |
Есть ВБ6 код, который возврашает залокированные ресурсы на удалённом сервере. Код перестал работать либо при переходе на АД, либо при переходе на WinServer2003. У кого-нибудь есть подобный скрипт для АД + WinServer2003? <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> 'Uses ActiveDS.tlb Dim fso As IADsFileServiceOperations Dim col As IADsCollection Dim item As IADsResource Dim strComputer As String strComputer = "1mmsql1" Set fso = GetObject("WinNT://" & strComputer & "/LanmanServer") Set col = fso.Resources For Each item In col On Error Resume Next 'Do not display pipes If Err.Number = 0 Then Debug.Print item.Name & " " & item.User & " " & item.Path & " " & item.LockCount End If On Error GoTo 0 Next item |
Автор: MEPJIuH 04.08.08, 09:56 |
Здравствуйте, помогите пожалуйста со скриптом следующего содержания: DC под Windows 2003 St. Требуется создать logon script, который будет обходить локальную группу "Администраторы" на компьютерах домена и складывать результаты в файл \\DomainContr\SomeFolder\LocalAdmList.txt в формате ComputerName User1 User2 ______________ После отработки скрипта скрипт удалялся из Logon Script. Заранее спасибо. |
Автор: Lachdanan 14.08.08, 07:50 |
Добрый день !! Помогите пожалуйста. Есть 2 скрипта один явовский и один вбшный. Как это всё засунуть в html файл при открытии которого на экране просто будет появлятся текст который просто это всё отображает на экране. Сами по себе скрипты просто как 1.js и 1.vbs выполняются и отрабатывают так как нужно а если это всё засунуть в html то нифига не работает ((( . Заранее спасибо. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> /* Описание: Вывод на экран сетевого имени компьютера и имени */ /* пользователя */ /*******************************************************************/ var objNet; //Создаем объект WshNetwork objNet = WScript.CreateObject("WScript.Network"); //Выводим на экран свойства ComputerName и UserName WScript.Echo("Имя машины:",objNet.ComputerName); WScript.Echo("Имя пользователя:",objNet.UserName); WScript.Echo("Имя домена:",objNet.UserDomain); /************* Конец *********************************************/ <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> On Error Resume Next strComputer = "localhost" Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") regValueDataMetric = "35" 'Set colItems = objWMIService.ExecQuery ("Select * From Win32_NetworkAdapter ") 'Where NetConnectionID = 'Wireless Network Connection' 'For Each objItem in colItems 'strMACAddress = objItem.MACAddress 'Wscript.Echo "MACAddress: " & strMACAddress 'Next Set colNetCard = objWMIService.ExecQuery ("Select * From Win32_NetworkAdapterConfiguration where IPEnabled=TRUE") For Each objNetCard in colNetCard 'If objNetCard.MACAddress = strMACAddress Then For Each strIPAddress in objNetCard.IPAddress Wscript.Echo "Description: " & objNetCard.Description Wscript.Echo "IP Address: " & strIPAddress Wscript.Echo "IPConnectionMetric: " & objNetCard.IPConnectionMetric objNetCard.SetIPConnectionMetric(regValueDataMetric) Next 'End If Next Пробовал тупо зделать создал файл 1.html засунул в него явовский скрипт он не работает таким образом .. проверил вообще выполнение скриптов вот так всё нормально работает тобишь проблема какая-то в обоих кодах в интерпритации с html. Помогите пожалуйста. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> <SCRIPT LANGUAGE="JavaScript"> document.write("asd") </SCRIPT> Конечная цель просто вывод всей этой информации на страницу. Если у кого-то есть готовое решение поделитесь пожалуйста. Заранее спасибо |
Автор: volvo877 14.08.08, 10:55 |
Под IE должно работать: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> <SCRIPT LANGUAGE="JavaScript"> //Создаем объект WshNetwork var objNet = new ActiveXObject("WScript.Network"); //Выводим на экран свойства ComputerName и UserName document.write("Имя машины:" + objNet.ComputerName + "<br>"); document.write("Имя пользователя:" + objNet.UserName + "<br>"); document.write("Имя домена:" + objNet.UserDomain); </SCRIPT> , под другими браузерами - вряд ли ... Со вторым скриптом сам справишься? |
Автор: Lachdanan 18.08.08, 09:17 |
Спасибо за 1-й всё работает с 2-м попробовал сам разобраться не получилось ((((( Помогите пожалуйста ещё раз )))))) |
Автор: volvo877 18.08.08, 10:24 |
Второй скрипт примерно вот так: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> (сейчас проверить не могу, IE недоступен) <SCRIPT LANGUAGE="JavaScript"> regValueDataMetric = "35"; var objLocator = new ActiveXObject("WbemScripting.SWbemLocator"); var objWMIService = objLocator.ConnectServer("", "\\root\\cimv2"); objWMIService.Security_.impersonationlevel = 3; var colNetCard = objWMIService.ExecQuery("Select * From Win32_NetworkAdapterConfiguration where IPEnabled=TRUE"); var enumObjNetCards = new Enumerator(colNetCard); for (;!enumObjNetCards.atEnd();enumObjNetCards.moveNext()) { var obj = enumObjNetCards.item(); for (var i = 0; i <= obj.IPAddress.ubound();i++) { document.write("Description: " + obj.Description + "<br>"); document.write("IP Address: " + obj.IPAddress(i) + "<br>"); document.write("IPConnectionMetric: " + obj.IPConnectionMetric + "<br>"); obj.SetIPConnectionMetric(regValueDataMetric); } } </SCRIPT> |
Автор: Lachdanan 18.08.08, 12:24 |
Супер всё пашет спасибо большое ещё раз ))))))) |
Автор: SIW 27.08.08, 09:53 |
Скрипт монтирует сетевые диски на основе членства в группах В поле заметки (Notes) в параметрах группы пишем коммент в формате: (буква диска)путь к сетевой папке например: (t)\\server\shara\common folder Если указываем букву диска "U" то цепляется папка с путем: \\server\shara\common folder\Username Сделано как персональная сетевая папка пользователя, доступная с любого компа в домене. соответсвенно на самой шаре раздаем нужные права пользователям. Если папка не существует или буква диска занята, то ничего не происходит... <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> on error resume next set objNet=CreateObject("wscript.network") UsrName=objNet.Username strUsrDN=GetUserDN(usrname) dim lst lst=GetMountArray(strUsrDN) for i=1 to ubound(lst) if lst(i,1)="U:" then objNet.MapNetworkDrive lst(i,1), lst(i,2)&UsrName else objNet.MapNetworkDrive lst(i,1), lst(i,2) end if next Function GetUserDN(username) Dim objConnection Dim objCommand Dim objRecordSet Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection objCommand.CommandText="<LDAP://dc=DOMAINNAME,dc=ru>;(&(objectCategory=User)(samaccountname="&username&"));ADsPath;subtree" Set objRecordSet=objCommand.Execute If objRecordSet.RecordCount=0 Then GetUserDN="" Else strADsPath=objRecordset.Fields("ADsPath") Set objUser=GetObject(strADsPath) objUser.GetInfo GetUserDN=objUser.Get("distinguishedName") End If objConnection.Close End Function rem ------------------------------------------------------------ rem GetFreeDrive функция поиска свободной буквы диска по списку. rem Принимает параметр в формате "A,B,C" где A,B,C буквы дисков. rem Выполняет последовательный перебор до первой свободной. rem В случае занятости всех возвращает пустую строку "". rem ------------------------------------------------------------ function GetFreeDrive(DriveList) Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") found="" while (len(DriveList)>0 and found="") drv=left(DriveList,1)&":" Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk where DeviceID='"&drv&"'") if (colDisks.Count>0) then if len(DriveList)>2 then DriveList=mid(DriveList,3) else DriveList="" end if else found=drv end if wend GetFreeDrive=found end function rem ------------------------------------------------------------ rem ------------------------------------------------------------ rem GetMountArray Создает массив соответствий диск-путь. rem Принимает параметром пользовательский DistinguishedName. rem Возвращает двумерный массив ("Буква диска", "путь"). rem ------------------------------------------------------------ function GetMountArray(strUserDN) Set objUser=GetObject("LDAP://"&strUserDN) grps=objUser.GetEx("memberOf") dim Groups redim Groups(ubound(grps),2) size=0 for each grp in grps On Error Resume Next Dim objGroup Set objGroup=GetObject("LDAP://"&grp) Const E_ADS_PROPERTY_NOT_FOUND = &h8000500D descr="" descr=objGroup.Get("info") If err.number <> E_ADS_PROPERTY_NOT_FOUND Then if (left(descr,1)="(") then size=size+1 pos=InStr(descr,")") letters=mid(descr,2,pos-2) path=mid(descr,pos+1) drv=GetFreeDrive(letters) Groups(size,1)=drv Groups(size,2)=path end if End If next dim Data redim Data(size,2) for i=1 to size Data(i,1)=Groups(i,1) Data(i,2)=Groups(i,2) next GetMountArray=data end function rem ------------------------------------------------------------ rem ------------------------------------------------------------ rem ParseVariables функция поиска переменных в строке и подстановки значений. rem возвращает обработанную строку rem ------------------------------------------------------------ function ParseVariables(strLine) set objNet=CreateObject("wscript.network") str=replace(lcase(strLine),"%username%",objNet.UserName) str=replace(str,"%computername%",objNet.ComputerName) ParseVariables=str end function Добавлено И вопрос в догонку: на основе предыдущего скрипта как можно сделать появления ярлыка на рабочем столе на основе членства в группах... Наподобие того что юзера закидываем в группу, у группы есть права доступа на сетевые программки, и автоматом появляется ярлычок на эту программку... |
Автор: qwert@ 03.09.08, 04:32 |
Помогите кто может с написанием скрипта vbs который удаляет файлы по маске во всех подпапках указанных папок, ну к примеру по адресу: C:\Новая папка. У меня почему то не выходит. ОС Windows 2000. |
Автор: Akina 03.09.08, 06:12 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> del /S "C:\Новая папка\*.txt" |
Автор: alec1024 03.09.08, 07:35 |
Столкнулся с проблемой..... Необходимо пробежаться по всем компам в домене и проверить на каких из них есть доменые пользователя состоящие в группе ЛОКАЛЬНЫХ АДМИНОВ....все облазел но нигде подобного скрипта нет((((( есть кто сталкивался с такой проблемой и есть ли решения? |
Автор: qwert@ 03.09.08, 19:19 |
Помогите кто может с написанием скрипта vbs который удаляет файлы по маске во всех подпапках указанных папок, ну к примеру по адресу: C:\Новая папка. У меня почему то не выходит. ОС Windows 2000. Что-то в этом духе: fso.deletefile "C:\Новая папка\*.*",1 Да и то, содержимое подпапок не могу удалить. Что нужно дописать, что б и все файлы в подпапках удалялись??? |
Автор: volvo877 03.09.08, 20:03 |
DeleteFile здесь не нужен: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> ... folder_name = "С:\NewFolder" Set fso = CreateObject("Scripting.FileSystemObject") fso.DeleteFolder folder_name ... |
Автор: SIW 08.09.08, 04:30 |
Подскажите плиз два вопросика: 1) как можно получить значение системной переменной окружения, например, USERPROFILE или WINDIR??? 2) как из скрипта можно запустить на выполнение другой скрипт? |
Автор: Domino 08.09.08, 05:50 |
1) <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> echo %USERPROFILE% echo %WINDIR% 2) <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> "другой скрипт.bat" |
Автор: SIW 08.09.08, 09:32 |
Сорри, но забыл уточнить... С пакетниками все ясно... Надо найти решения для VBA... Первый вопрос уже решил вот таким образом: Там оказывается для того чтобы вытащить переменную "USERPROFILE" надо указать тип переменных "Process". Иначе работать не хотело... <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Set WshShell = CreateObject("WScript.Shell") Set WshEnv = WshShell.Environment("Process") UsrProfile = WshEnv.Item("USERPROFILE") Второй вопрос пока остается открытым... Из скрипта VBA Надо запестить на выполнение "другой скрипт.vbs" |
Автор: volvo877 08.09.08, 12:13 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> set ws = CreateObject("WScript.Shell") ws.run("D:\другой_скрипт.vbs") |
Автор: Tapac 09.09.08, 14:00 |
извините за оффтоп, у кого есть книга по этим .vbs скриптам ? |
Автор: AlexJ 09.09.08, 14:32 |
У Майкрософта... точно есть http://msdn.microsoft.com/en-us/library/aa394572(VS.85).aspx http://www.microsoft.com/technet/scriptcenter/tools/wmimatic.mspx http://www.microsoft.com/downloads/details.aspx?displaylang=en&familyid=9ef05cbd-c1c5-41e7-9da8-212c414a7ab0 Windows Script 5.7 for Windows XP: This download installs Microsoft® Windows® Script containing Visual Basic® Script Edition (VBScript.) Version 5.7, JScript® Version 5.7, Windows Script Components, Windows Script Host 5.7, and Windows Script Runtime Version 5.7. http://www.microsoft.com/downloads/details.aspx?familyid=47809025-D896-482E-A0D6-524E7E844D81&displaylang=en ADSI Scriptomatic The ADSI Scriptomatic is designed to help you write ADSI scripts; that is, scripts that can be used to manage Active Directory. http://www.microsoft.com/downloads/details.aspx?FamilyID=39044e17-2490-487d-9a92-ce5dcd311228&DisplayLang=en Scriptomatic 2.0, which will allow you to save your script output as a text file or an Excel spreadsheet; which will allow you to display output in a Web page; which will even allow you to write scripts in Jscript, Perl, or Python. http://www.microsoft.com/downloads/details.aspx?familyid=09DFC342-648B-4119-B7EB-783B0F7D1178&displaylang=en Tweakomatic : The Tweakomatic is a nifty new utility that writes scripts that allow you to retrieve and/or configure Windows and Internet Explorer settings. http://www.microsoft.com/downloads/details.aspx?familyid=bd328d1e-6c01-4447-bd7c-c09646d722c8&displaylang=en Do-It-Yourself Script Center Kit: http://www.microsoft.com/downloads/details.aspx?familyid=D187C9D7-FFA8-49CD-BB33-363DB8FA481E&displaylang=en |
Автор: SIW 11.09.08, 03:09 |
volvo877 Спасибо, в принципе работает... Вот только проблема работает оно с при указании локального пути... а как сделать что бы работало по UNC-путям (\\server\share\folder\another_script_to_run.vbs) |
Автор: blackangel 14.09.08, 13:21 |
Есть кусочек кода(см ниже) в котором strComputer присваевается список машин домена. По окончании цикла мне нужно будет сравнить каждую строку со строками в некотором файле. Если strComputer записать в файл, то там все понятно, вопросов нет.... А вот как сделать так чтоб strComputer "закинуть" сразу в память и уже там работать со строками? Спасибо! <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> For Each objComputer In colComputers strComputer = strComputer & objComputer.Name & vbCrLf Next |
Автор: ok1 17.09.08, 23:40 |
Привет Всем. Подскажите, пожалуйста, по возможности с примерчиком, как подключиться к удаленному комру с админовскими правами, если имеется учетная запись только локального админа? Как в таком случае создать еще один локальный (для удаленного компа) аккаунт, например, для Power User ? Спасбо! |
Автор: alec1024 18.09.08, 12:43 |
Столкнулся с проблемой..... Необходимо пробежаться по всем компам в домене и проверить на каких из них есть доменые пользователя состоящие в группе ЛОКАЛЬНЫХ АДМИНОВ....все облазел но нигде подобного скрипта нет((((( есть кто сталкивался с такой проблемой и есть ли решения? |
Автор: Arny 22.09.08, 10:37 |
alec1024, запускайте cscript /nologo scriptname.vbs > \\server\share\%computername%.txt получите что то типа: Comp/Administrator Comp/LNSS_MONITOR_USR Comp/User1 в файлике с именем компа на котором запускалось Скрипт: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colAccounts = objWMIService.ExecQuery _ ("Select * From Win32_Group Where LocalAccount = TRUE And SID = 'S-1-5-32-544'") For Each objAccount in colAccounts strGroup = objAccount.Name Next Set objGroup = GetObject("WinNT://" & strComputer & "/" & strGroup) For Each objUser in objGroup.Members strUserPath = objUser.aDSPath strUserPath = Replace(strUserPath, "WinNT://", "") Wscript.Echo strUserPath Next Если нужно чтобы все было в одном файле, то одну ">" заменяем двумя ">>" |
Автор: dolph2005 14.10.08, 06:51 |
Привет всем. Не могли бы подсказать скрипт для аудита удаления папок? Как я себе представляю это должно выглядеть примерно так: Выгружаем из журнала событий безопасности события с ID 560 и 564, и далее сравниваем в них код дескриптора, и выводим информацию в документ (Excel?). Но как это реализовать даже пока представить не могу... Помогите плз. Спасибо. |
Автор: alec1024 16.10.08, 07:38 |
Подскажите пожалуйста как в следующем скрипте сделать так чтобы проверялось имя компьютера и если оно например равно spb1, то запись в файл не скидывать......ну тоесть нужно исключить пару компьютеров Dim objAD, objUserName, objComputerName Dim objFS, objFile Const strPath = "\\server\log.txt" Const ForAppending = 8 Set objAD = CreateObject("ADSystemInfo") Set objUserName = GetObject("LDAP://" & objAD.UserName) Set objComputerName = GetObject("LDAP://" & objAD.ComputerName) Set objFS = CreateObject("Scripting.FileSystemObject") Set objFile = objFS.OpenTextFile(strPath, ForAppending, True) objFile.WriteLine(Date & ";" & Time & ";" & objComputerName.cn & ";" & objUserName.cn) objFile.Close Set objFS = Nothing Set objFile = Nothing Set objUserName = Nothing Set objComputerName = Nothing Set objAD = Nothing |
Автор: Domino 16.10.08, 09:24 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim objAD, objUserName, objComputerName Dim objFS, objFile Const strPath = "\\server\log.txt" Const ForAppending = 8 Set objAD = CreateObject("ADSystemInfo") Set objUserName = GetObject("LDAP://" & objAD.UserName) Set objComputerName = GetObject("LDAP://" & objAD.ComputerName) If objAD.ComputerName <> "spb1" Set objFS = CreateObject("Scripting.FileSystemObject") Set objFile = objFS.OpenTextFile(strPath, ForAppending, True) objFile.WriteLine(Date & ";" & Time & ";" & objComputerName.cn & ";" & objUserName.cn) objFile.Close Set objFS = Nothing Set objFile = Nothing End If Set objUserName = Nothing Set objComputerName = Nothing Set objAD = Nothing |
Автор: alec1024 11.11.08, 09:18 |
Есть скрипт , который добавляет в дескрипшен компа имя залогиненого пользователя, можно ли зделать так чтобы подставлялся не логин а полное имя с фамилией из AD On Error Resume Next strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colComputer = objWMIService.ExecQuery _ ("Select * from Win32_ComputerSystem") For Each objComputer In colComputer strNewDescription = objComputer.UserName Next st=right(strNewDescription,len(strNewDescription)-8) Set colItems = objWMIService.ExecQuery( _ "SELECT * FROM Win32_UserAccount WHERE Name='" & st & "'", , 48) For Each objItem In colItems strNewDescription = objItem.FullName Next Set objWMIService = GetObject("winmgmts:\\" & strComputer).InstancesOf("Win32_OperatingSystem") For Each x In objWMIService x.Description = strNewDescription x.Put_ Next |
Автор: Dmitrii 11.11.08, 13:18 |
Приведённый Вами сценарий успешно выполняет указанную задачу. Совет: вместо конструкции <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colComputer = objWMIService.ExecQuery _ ("Select * from Win32_ComputerSystem") For Each objComputer In colComputer strNewDescription = objComputer.UserName Next st=right(strNewDescription,len(strNewDescription)-8) Set colItems = objWMIService.ExecQuery( _ "SELECT * FROM Win32_UserAccount WHERE Name='" & st & "'", , 48) For Each objItem In colItems strNewDescription = objItem.FullName Next можно использовать такой её аналог <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Set objWSNet = CreateObject("WScript.Network") st = objWSNet.UserName strDomain = objWSNet.UserDomain Set objUser = GetObject("WinNT://" & strDomain & "/" & st & ",user") strNewDescription = objUser.FullName |
Автор: alec1024 12.11.08, 09:02 |
Цитата Dmitrii @ Приведённый Вами сценарий успешно выполняет указанную задачу. Совет: вместо конструкции <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colComputer = objWMIService.ExecQuery _ ("Select * from Win32_ComputerSystem") For Each objComputer In colComputer strNewDescription = objComputer.UserName Next st=right(strNewDescription,len(strNewDescription)-8) Set colItems = objWMIService.ExecQuery( _ "SELECT * FROM Win32_UserAccount WHERE Name='" & st & "'", , 48) For Each objItem In colItems strNewDescription = objItem.FullName Next можно использовать такой её аналог <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Set objWSNet = CreateObject("WScript.Network") st = objWSNet.UserName strDomain = objWSNet.UserDomain Set objUser = GetObject("WinNT://" & strDomain & "/" & st & ",user") strNewDescription = objUser.FullName А не подскажете каким образом этот скрипт можно запустить на удаленном компьютере, на котором пользователь не админ. Ведь нужны админские права чтоб поменять дескрипшен? |
Автор: Dmitrii 14.11.08, 14:55 |
Цитата alec1024 @ Если Вам известны имя и пароль учётной записи администратора домена или локального администратора удалённой станции, то так, например:... каким образом этот скрипт можно запустить на удаленном компьютере, на котором пользователь не админ. Ведь нужны админские права чтоб поменять дескрипшен? <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim strComputer, strDomain Dim strUser, strUserPass, strDescription Dim objWSNet, objUser Dim objLocator, objService Dim objCollection, objItem Set objWSNet = CreateObject("WScript.Network") strDomain = objWSNet.UserDomain Set objWSNet = Nothing strUser = "имя учётной записи администратора" strUserPass = "пароль учётной записи администратора" strComputer = "имя удалённой станции" Set objLocator = CreateObject("WbemScripting.SWbemLocator") Set objService = objLocator.ConnectServer(strComputer, "root\cimv2", strDomain & "\" & strUser, strUserPass) Set objCollection = objService.InstancesOf("Win32_ComputerSystem") For Each objItem In objCollection strDescription = objItem.UserName Next If IsNull(strDescription) Then WScript.Echo "Имя пользователя не определёно." Else strDescription = Replace(strDescription, "\", "/") Set objUser = GetObject("WinNT://" & strDescription & ",user") strDescription = objUser.FullName Set objUser = Nothing Set objCollection = objService.InstancesOf("Win32_OperatingSystem") For Each objItem In objCollection objItem.Description = strDescription objItem.Put_ Next Set objItem = Nothing WScript.Echo "Готово." End If Set objCollection = Nothing Set objService = Nothing Set objLocator = Nothing |
Автор: alec1024 19.11.08, 07:28 |
Цитата Dmitrii @ Цитата alec1024 @ Если Вам известны имя и пароль учётной записи администратора домена или локального администратора удалённой станции, то так, например:... каким образом этот скрипт можно запустить на удаленном компьютере, на котором пользователь не админ. Ведь нужны админские права чтоб поменять дескрипшен? <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim strComputer, strDomain Dim strUser, strUserPass, strDescription Dim objWSNet, objUser Dim objLocator, objService Dim objCollection, objItem Set objWSNet = CreateObject("WScript.Network") strDomain = objWSNet.UserDomain Set objWSNet = Nothing strUser = "имя учётной записи администратора" strUserPass = "пароль учётной записи администратора" strComputer = "имя удалённой станции" Set objLocator = CreateObject("WbemScripting.SWbemLocator") Set objService = objLocator.ConnectServer(strComputer, "root\cimv2", strDomain & "\" & strUser, strUserPass) Set objCollection = objService.InstancesOf("Win32_ComputerSystem") For Each objItem In objCollection strDescription = objItem.UserName Next If IsNull(strDescription) Then WScript.Echo "Имя пользователя не определёно." Else strDescription = Replace(strDescription, "\", "/") Set objUser = GetObject("WinNT://" & strDescription & ",user") strDescription = objUser.FullName Set objUser = Nothing Set objCollection = objService.InstancesOf("Win32_OperatingSystem") For Each objItem In objCollection objItem.Description = strDescription objItem.Put_ Next Set objItem = Nothing WScript.Echo "Готово." End If Set objCollection = Nothing Set objService = Nothing Set objLocator = Nothing Большое Спасибо!!!!!! А есть возможность этот скрипт запустить автоматом на всех компах домена ,без указывания конкретного компа? |
Автор: Dmitrii 19.11.08, 14:00 |
Здесь всё просто: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Set objWSNet = CreateObject("WScript.Network") strComputer = objWSNet.ComputerName Set objWSNet = Nothing Подразумевается использование групповой политики Конфигурация пользователя - Конфигурация Windows - Сценарии (вход/выход из системы)? Если - "да", то нельзя. Впрочем, загляните сюда Полезные скрипты, сообщение #93. Можно попробовать задействовать указанный там способ. |
Автор: illus 15.12.08, 10:25 |
подскажите пожалуйста, как по логину в AD получить имя компьютера на котором он сидит? на входе логин, на выходе имя компьютера, в идеале с ip) |
Автор: Dmitrii 15.12.08, 14:35 |
Цитата illus @ Обратите внимание на сценарий, помещённый в сообщении 110 данной темы:... как по логину в AD получить имя компьютера на котором он сидит? на входе логин, на выходе имя компьютера, в идеале с ip) http://forum.sources.ru/index.php?showtopi...dpost&p=1857889 Здесь решается очень похожая задача. |
Автор: illus 16.12.08, 08:31 |
c:\temp_script.sm(53, 1) (null): сетевой путь не найден , с чем может быть связана ошибка при запуске скрипта? |
Автор: Dmitrii 16.12.08, 10:02 |
Цитата illus @ c:\temp_script.sm(53, 1) (null): сетевой путь не найден , с чем может быть связана ошибка при запуске скрипта? 1. Что такое temp_script.sm? 2. При выполнении какой строки кода появляется такая ошибка? |
Автор: illus 16.12.08, 13:48 |
в сообщении 110 данной темы я взял целиком код, однако, при выполнении появляется консольное окошко с данной ошибкой, адрес строки и подобные аттрибуты не указаны |
Автор: Dmitrii 16.12.08, 14:52 |
Адрес строки с ошибкой указан: 53. Мы с Вами на него просто не обратили внимание. Цитата illus @ Следовало внимательно просмотреть код, прежде, чем использовать. В строке 53 надо указать реальное имя домена, вместо моего комментария.в сообщении 110 данной темы я взял целиком код, однако, при выполнении появляется консольное окошко с данной ошибкой... Впрочем, чтобы не "связываться" с константой, строку Const strDomane = "здесь - DNS-имя домена" замените на фрагмент: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim strDomane, objWSNet Set objWSNet = CreateObject("WScript.Network") strDomane = objWSNet.UserDomain Set objWSNet = Nothing Наконец, стоит исправить и мою опечатку: в теле функции Computers_List() замените strDomane на strDomain (в коде исходного примера соответствующие исправления уже сделаны). |
Автор: illus 18.12.08, 07:06 |
Function Comuters_List(arrTemp) Dim objAD, objComputer, strTemp, strList Dim strDomain, objWSNet Set objWSNet = CreateObject("WScript.Network") strDomain = objWSNet.UserDomain Set objWSNet = Nothing Const strGroup = "Компьютеры домена" Set objAD = GetObject("WinNT://" & strDomain & "/" & strGroup & ",group") For Each objItem In objAD.Members If Not objItem.AccountDisabled Then strTemp = objItem.Name strList = strList & Left(strTemp, Len(strTemp) - 1) & vbNewLine End If Next Set objAD = Nothing arrTemp = Split(strList, vbNewLine) Call Sorting_Array(arrTemp) End Function и я так понимаю что бы скрипт законектился к домену необходимо прописать имя домена в strDomain? Потому как скрипт утверждает что сетевой путь не найден. |
Автор: Dmitrii 18.12.08, 08:13 |
Цитата illus @ В таком варианте сценария имя домена определяется автоматически. Вот этот фрагмент:я так понимаю что бы скрипт законектился к домену необходимо прописать имя домена в strDomain?.. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Set objWSNet = CreateObject("WScript.Network") strDomain = objWSNet.UserDomain У меня сценарий прекрасно работает. Если ошибка возникает при использовании именно такого варианта сценария, то попробуйте выражение Set objAD = GetObject("WinNT://" & strDomain & "/" & strGroup & ",group") заменить на Set objAD = GetObject("WinNT://" & strDomain & "/" & strPDC & "/" & strGroup & ",group") Здесь strPDC - это DNS-имя основного контроллера домена. |
Автор: Dark-Dragon 22.12.08, 11:50 |
Народ помогите написать скрипт. Нужно отсканировать все компы в домене на наличие документов (doc/xls/ и т.д.). Нужно что бы выдавался список содержащий компы и список документов на них |
Автор: Dmitrii 23.12.08, 12:37 |
Цитата Dark-Dragon @ Сценарий для решения такой задачи и не самый быстрый, и не самый удобный инструмент.Нужно отсканировать все компы в домене на наличие документов (doc/xls/ и т.д.). Нужно что бы выдавался список содержащий компы и список документов на них Но если сильно надо, то вот одна из возможных реализаций (на VBS): <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> On Error Resume Next Dim objWMI, objCollection, objItem, objWSNet, objFS, objFile Dim arrComputers, arrDrives Dim strSource, lngFiles, blnErrFlag, i, j Const strResFile = "C:\ListObjects.txt" Call Comuters_List(arrComputers) Set objWSNet = CreateObject("WScript.Network") Set objFS = CreateObject("Scripting.FileSystemObject") Set objFile = objFS.OpenTextFile(strResFile, 2, True) For i = 0 To UBound(arrComputers) If Available(arrComputers(i)) Then Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & arrComputers(i) & "\root\cimv2") Set objCollection = objWMI.ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType=3") ReDim arrDrives(objCollection.Count - 1) j = 0 For Each objItem In objCollection arrDrives(j) = objItem.DeviceID j = j + 1 Next WScript.Echo arrComputers(i) & vbNewLine & "-----" objFile.WriteLine arrComputers(i) For j = 0 To UBound(arrDrives) strSource = Free_Letter lngFiles = 0 If Len(strSource) > 0 Then strSource = strSource & ":" objWSNet.MapNetworkDrive strSource, "\\" & arrComputers(i) & "\" & Left(arrDrives(j), 1) & "$" WScript.Echo "Просмотрено файлов на диске " & arrDrives(j) Call View_Folder(strSource & "\", arrDrives(j)) objWSNet.RemoveNetworkDrive strSource, True WScript.Echo Else WScript.Echo "Нет свободных имён для назначения сетевому тому. Продолжение работы невозможно." blnErrFlag = True Exit For End If Next Erase arrDrives WScript.Echo "=====" Else objFile.WriteLine arrComputers(i) & " не отвечает." End If If blnErrFlag Then Exit For Next Erase arrComputers If Not objFile Is Nothing Then objFile.Close Set objFile = Nothing End If Set objFS = Nothing Set objWSNet = Nothing Set objCollection = Nothing Set objWMI = Nothing WScript.Echo "Готово." WScript.Quit 0 '=== Function Comuters_List(arrTemp) Dim objAD, objItem, strTemp, strList Dim strDomain, objWSNet Const strGroup = "Компьютеры домена" Set objWSNet = CreateObject("WScript.Network") strDomain = objWSNet.UserDomain Set objWSNet = Nothing Set objAD = GetObject("WinNT://" & strDomain & "/" & strGroup & ",group") For Each objItem In objAD.Members If Not objItem.AccountDisabled Then strTemp = objItem.Name strList = strList & Left(strTemp, Len(strTemp) - 1) & vbNewLine End If Next Set objAD = Nothing arrTemp = Split(strList, vbNewLine) ReDim Preserve arrTemp(UBound(arrTemp) - 1) Call Sorting_Array(arrTemp) End Function '=== Function Sorting_Array(arrTemp) Dim blnStopSort, intNumChange, strTemp, i, j blnStopSort = False i = 1 Do intNumChange = 0 For j = 0 To UBound(arrTemp) - 1 If arrTemp(j) > arrTemp(j + 1) Then strTemp = arrTemp(j) arrTemp(j) = arrTemp(j + 1) arrTemp(j + 1) = strTemp intNumChange = intNumChange + 1 End If Next If intNumChange = 0 Then blnStopSort = True Else If i < UBound(arrTemp) Then i = i + 1 Else blnStopSort = True End If End If Loop While Not blnStopSort End Function '=== Function Available(strComputer) Dim objShell, objExec, objOutStream Dim strResPing, intResFind Set objShell = CreateObject("WScript.Shell") Set objExec = objShell.Exec("ping -n 1 -w 300 " & strComputer) Set objOutStream = objExec.StdOut strResPing = vbNullString While Not objOutStream.AtEndOfStream strResPing = strResPing & Trim(objOutStream.ReadLine()) Wend If InStr(1, strResPing, "TTL", vbTextCompare) > 1 Then Available = True Else Available = False End If Set objOutStream = Nothing Set objExec = Nothing Set objShell = Nothing End Function '=== Function View_Folder(strSource, strDrive) Dim objDir, objItem Set objDir = objFS.GetFolder(strSource) Call Enum_Files(strSource, strDrive) For Each objItem In objDir.SubFolders Call View_Folder(strSource & "\" & objItem.Name, strDrive) Next Set objDir = Nothing End Function '=== Function Enum_Files(strSource, strDrive) Dim objDir, objItem, strTemp Set objDir = objFS.GetFolder(strSource) For Each objItem In objDir.Files If Err.Number <> 0 Then Err.Clear Else strTemp = UCase(objFS.GetExtensionName(objItem.Name)) If strTemp = "DOC" Or strTemp = "XLS" Then objFile.WriteLine strDrive & "\" & Mid(objItem.Path, 4) End If End If lngFiles = lngFiles + 1 WScript.StdOut.Write lngFiles & Chr(13) Next Set objItem = Nothing Set objDir = Nothing End Function '=== Function Free_Letter() Dim objWMIServ, objDrives, objDrive Dim arrTemp(25), i Set objWMIServ = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") Set objDrives = objWMIServ.ExecQuery("SELECT DeviceID FROM Win32_LogicalDisk") For Each objDrive In objDrives arrTemp(Asc(UCase(objDrive.DeviceID)) - 65) = True Next Set objDrive = Nothing Set objDrives = Nothing Set objWMIServ = Nothing For i = 3 To 25 If Not arrTemp(i) Then Exit For Next If i < 26 Then Free_Letter = Chr(i + 65) Else Free_Letter = vbNullString End If Erase arrTemp End Function Примечания: 1. Сценарий предназначен для работы в консольном режиме. 2. Проверок для "отлова" возможных ошибок работы сценария здесь самый минимум. Так что, если захотите возиться с этой "портянкой", то все прочие проверки Вам придётся добавлять самостоятельно. |
Автор: grusiner 10.01.09, 09:56 |
Всем привет! Помогите найти скрипт, нужно выгрузить из AD пользователей с Display name, account, e-mail в файл excel или notepad. Нигде не могу найти... |
Автор: Arny 10.01.09, 11:12 |
grusiner, а экспортом не пробовал воспользоваться? |
Автор: grusiner 10.01.09, 12:27 |
Экспорт e-mail адреса не экспортирует. |
Автор: Dmitrii 12.01.09, 09:30 |
Цитата grusiner @ Так, например:... нужно выгрузить из AD пользователей с Display name, account, e-mail в файл excel или notepad... <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim objRoot, objConnection, objCommand, objRSet Dim objFS, objFile Dim strDomain, strAttributes, intNumFields Const strResFile = "C:\Users.txt" Set objRoot = GetObject("LDAP://RootDSE") strDomain = objRoot.Get("DefaultNamingContext") Set objRoot = Nothing strAttributes = "DisplayName,UserPrincipalName,SamAccountName,Mail" Set objConnection = CreateObject("ADODB.Connection") objConnection.Provider = "ADsDSOObject" objConnection.Open "Active Directory Provider" Set objCommand = CreateObject("ADODB.Command") Set objCommand.ActiveConnection = objConnection objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Sort On") = "DisplayName" Set objFS = CreateObject("Scripting.FileSystemObject") Set objFile = objFS.CreateTextFile(strResFile, True) objCommand.CommandText = "<LDAP://" & strDomain & ">;(&(objectCategory=Person)(objectClass=User));" _ & strAttributes & ";Subtree" Set objRSet = objCommand.Execute If objRSet.RecordCount > 0 Then objRSet.MoveFirst intNumFields = objRSet.Fields.Count Do Until objRSet.EOF If Len(objRSet.Fields("UserPrincipalName").Value) > 0 Then For i = 0 To intNumFields - 2 objFile.Write(objRSet.Fields(i).Value & vbTab) Next objFile.Write(objRSet.Fields(intNumFields - 1).Value & vbNewLine) End If objRSet.MoveNext Loop End If objFile.Close Set objFile = Nothing Set objFS = Nothing Set objRSet = Nothing Set objCommand = Nothing Set objConnection = Nothing WScript.Echo "Готово." WScript.Quit 0 |
Автор: Amorphus 22.01.09, 05:21 |
Здравствуйте! Помогите пожалуйста со скриптом. У нас домен, есть принт сервер. Периодически приезжают в контору люди из других организаций и им нужно печатать документы. Но на сервер они зайти не могут без Login и Password. И как следствие не могут получить доступ к принтеру. Раньше у нас был батничек с Net Usе'ом, в котором был прописан пароль и пользователь для печати. Но теперь этот батник не работает. Попробовал использовать VBS с AddWindowsPrinterConnection, но у этой функции нет возможности передачи логина (и соответственно получаю сообщение об ошибке при доступе к принтеру). AddPrinterConnection требует порт, - это тоже не подходит. Нет ли возможности использовать что-то вроде этого? On Error Resume Next Set WshNetwork = WScript.CreateObject("WScript.Network") wshNetwork.AddWindowsPrinterConnection "\\Server\Printer", User, Pass wshNetwork.SetDefaultPrinter "\\Server\Printer" Заранее спасибо. |
Автор: grusiner 22.01.09, 14:52 |
Dmitrii Спасибо за скрипт!!! |
Автор: ^D^ima 03.02.09, 11:40 |
Подскажите скрипт изменения настроек энергосбережения. Добавлено Что-то много винда в реестре правит CreateKey HKCU\Control Panel\PowerCfg\GlobalPowerPolicy (null) Key: 0xE13EAB98 CreateKey HKLM\Software\Microsoft\Windows\CurrentVersion\Controls Folder\PowerCfg\GlobalPowerPolicy (null) Key: 0xE5AB5EA0 CreateKey HKLM\Software\Microsoft\Windows\CurrentVersion\Controls Folder\PowerCfg\ProcessorPolicies\3 (null) Key: 0xE13EAB98 CreateKey HKCU\Control Panel\PowerCfg\PowerPolicies\3 (null) Key: 0xE5AB84F8 CreateKey HKLM\Software\Microsoft\Windows\CurrentVersion\Controls Folder\PowerCfg\PowerPolicies\3 (null) Key: 0xE5C63C88 CreateKey HKCU\Control Panel\PowerCfg\GlobalPowerPolicy (null) Key: 0xE5FD4828 CreateKey HKLM\Software\Microsoft\Windows\CurrentVersion\Controls Folder\PowerCfg\GlobalPowerPolicy (null) Key: 0xE13EAB98 CreateKey HKLM\SYSTEM\CURRENTCONTROLSET\Control\Session Manager\Power (null) Key: 0xE5FD4828 CreateKey HKCU\Control Panel\PowerCfg (null) Key: 0xE13EAB98 Добавлено Но судя по тому, что параметры спячки экрана нразные под разныи пользователями, то нас интересует только ветки HKCU\Control Panel\PowerCfg\ |
Автор: Akina 03.02.09, 14:26 |
http://technet.microsoft.com/ru-ru/library/cc748940.aspx надеюсь, построить строку запуска сможешь? |
Автор: ^D^ima 03.02.09, 15:08 |
попробуем. cpl c правами админа не меняла у пользователей |
Автор: lumenok 02.03.09, 07:48 |
Стоит небольшая задача Например у человека в настройках сетевого подключения прописан ip адрес 10.2.5.1, маска подсети 255.128.0.0, основной шлюз 10.0.0.100, днс сервер 10.0.0.100. А мне необходимо сменить у человека маску подсети на 255.255.0.0 и шлюз на 10.2.0.100, а остальные настройки оставить без изменений. И причем скрипт у меня должен содержать обработку по ip адресам, то есть если у человека первые две цифры ip адреса 10.2, то шлюз у него должен измениться на 10.2.0.100, а если ip адрес начинается 10.3, то шлюз у него должен измениться на 10.3.0.100, а маска посдети 255.255.0.0 и днс 10.0.0.100 Скрипт смены настроек сетевого подключения нашел на вашем форуме Полезные скрипты но в программировании vbs скриптов не силен, прошу помощи |
Автор: GrumblerXX 13.03.09, 12:43 |
Здравствуйте. Помогите жалуйста найти ошибку. Скрипты ругаются и не работают. Вот например. Скрипт сгенерированный WMI Code Creator strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") ' Obtain an instance of the the class ' using a key property value. Set objShare = objWMIService.Get("Win32_TerminalServiceSetting.ReplaceKeyProperty=ReplacePropertyValue") ' Obtain an InParameters object specific ' to the method. Set objInParam = objShare.Methods_("SetAllowTSConnections"). _ inParameters.SpawnInstance_() ' Add the input parameters. objInParam.Properties_.Item("AllowTSConnections") = 1 ' Execute the method and obtain the return status. ' The OutParameters object in objOutParams ' is created by the provider. Set objOutParams = objWMIService.ExecMethod("Win32_TerminalServiceSetting.ReplaceKeyProperty=ReplacePropertyValue", "SetAllowTSConnections", objInParam) ' List OutParams Wscript.Echo "Out Parameters: " Wscript.echo "ReturnValue: " & objOutParams.ReturnValue Ругается : Ошибка код 8004103A Недопустимый путь к обекту. Источник SWbemSevicesEx. Строка 6 символ 1. Это - Set objShare = objWMIService.Get("Win32_TerminalServiceSetting.ReplaceKeyProperty=ReplacePropertyValue") Заранее спасибо |
Автор: KAMASAK 30.03.09, 20:31 |
Узнать баланс МТС. Работает с несколькими номерами... Записать всё в файл phones.txt и кинуть рядом со ь скриптом. Запись формата: Мой_телефон +79160000000 0000 Где последние 0000 пароль от учётки Интернет помощника МТС. ЗЫ в Интернет помощник нужно заранее войти из IE. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Const PhonePrefix = "+7" ' +7... PhoneLen = 12 ' полная длина телефонного номера PrefixLen = Len(PhonePrefix) ' = 2 'PrefixLen = 0 ' установить, если в форму надо вводить полный номер телефона (с +7) Const Curr = " руб." Const ForReading = 1 Const ForWriting = 2 Function GetBalance(phone, password, balance) Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = False 'objIE.Navigate "https://www.spb.mts.ru/selfcare/" ' МТС Санкт-Петербург objIE.Navigate "https://ihelper.mts.ru/selfcare/" ' МТС Москва While objIE.Busy WScript.Sleep 10 Wend Set objForm = objIE.Document.forms("aspnetForm") objForm.elements("ctl00$phContent$tbPhoneNumber").value = phone objForm.elements("ctl00$phContent$tbPassword").value = password objForm.elements("ctl00_phContent_btnEnter").click While objIE.Busy WScript.Sleep 10 Wend Set objForm = objIE.Document.forms("aspnetForm") balance = objForm.elements.all("customer-info-balance").InnerHTML objIE.quit End Function Set objFSO = CreateObject("Scripting.FileSystemObject") Set PhoneFile = objFSO.OpenTextFile("phones.txt", ForReading) Set objExplorer = CreateObject("InternetExplorer.Application") objExplorer.Navigate "about:blank" objExplorer.ToolBar = 0 objExplorer.StatusBar = 0 objExplorer.Width = 300 objExplorer.Height = 400 objExplorer.Left = 0 objExplorer.Top = 0 Do While (objExplorer.Busy) Wscript.Sleep 10 Loop objExplorer.Document.Title = "Balance Information" objExplorer.Visible = 1 objExplorer.Document.Body.InnerHTML = "" With PhoneFile Do Until .AtEndOfStream strLine = .ReadLine If (Trim(strLine) <> "") and (Instr(strLine,PhonePrefix) > 0) Then alias = mid(strline,1,Instr(strLine,PhonePrefix)-1) ' название телефона tmp = mid(strline,Instr(strLine,"+7")+PrefixLen,255) ' эта строка начинается с номера телефона (без +7) phone = mid(tmp,1,Instr(tmp," ")-1) ' телефон тут (без +7) tmp = Trim(mid(strline,Len(alias) + Len(phone) + 1 + PrefixLen,255)) ' эта строка начинается с пароля pass = Trim(mid(tmp,1,Instr(tmp," "))) ' если после пароля еще есть пробелы - отделим их if pass = "" Then ' если нету - и не надо... pass = tmp End If alias = Trim(alias) ' обрезаем пробелы ' wscript.echo alias & ":" & phone& ":" & pass & ":" ' ****************** отладка If (Len(phone) = PhoneLen - PrefixLen) Then Call GetBalance(phone,pass, sum) objExplorer.Document.Body.InnerHTML = objExplorer.Document.Body.InnerHTML & "<B>" & alias & "</B>" & ": " & sum & Curr & "<BR>" ' wscript.echo alias & ":" & phone & ":" & sum ' ****************** отладка End If End If Loop .Close End With objExplorer.Document.Body.InnerHTML = objExplorer.Document.Body.InnerHTML & "<BR><B>OK</B>" |
Автор: mr.Neo 16.04.09, 19:54 |
интересует скриптик для отключения/включения сетевого интерфейса... |
Автор: PokerFlat 04.06.09, 04:03 |
Здравствуйте! Поражен вашими знаниями, отличный форум, рад что нашел его... У меня не много вопросов... Код взят с этой темы, он добавляет сетевой диск на основание заметки у групп... <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> on error resume next set objNet=CreateObject("wscript.network") UsrName=objNet.Username strUsrDN=GetUserDN(usrname) dim lst lst=GetMountArray(strUsrDN) for i=1 to ubound(lst) if lst(i,1)="U:" then objNet.MapNetworkDrive lst(i,1), lst(i,2)&UsrName else objNet.MapNetworkDrive lst(i,1), lst(i,2) end if next Function GetUserDN(username) Dim objConnection Dim objCommand Dim objRecordSet Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection objCommand.CommandText="<LDAP://dc=DOMAINNAME,dc=ru>;(&(objectCategory=User)(samaccountname="&username&"));ADsPath;subtree" Set objRecordSet=objCommand.Execute If objRecordSet.RecordCount=0 Then GetUserDN="" Else strADsPath=objRecordset.Fields("ADsPath") Set objUser=GetObject(strADsPath) objUser.GetInfo GetUserDN=objUser.Get("distinguishedName") End If objConnection.Close End Function rem ------------------------------------------------------------ rem GetFreeDrive функция поиска свободной буквы диска по списку. rem Принимает параметр в формате "A,B,C" где A,B,C буквы дисков. rem Выполняет последовательный перебор до первой свободной. rem В случае занятости всех возвращает пустую строку "". rem ------------------------------------------------------------ function GetFreeDrive(DriveList) Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") found="" while (len(DriveList)>0 and found="") drv=left(DriveList,1)&":" Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk where DeviceID='"&drv&"'") if (colDisks.Count>0) then if len(DriveList)>2 then DriveList=mid(DriveList,3) else DriveList="" end if else found=drv end if wend GetFreeDrive=found end function rem ------------------------------------------------------------ rem ------------------------------------------------------------ rem GetMountArray Создает массив соответствий диск-путь. rem Принимает параметром пользовательский DistinguishedName. rem Возвращает двумерный массив ("Буква диска", "путь"). rem ------------------------------------------------------------ function GetMountArray(strUserDN) Set objUser=GetObject("LDAP://"&strUserDN) grps=objUser.GetEx("memberOf") dim Groups redim Groups(ubound(grps),2) size=0 for each grp in grps On Error Resume Next Dim objGroup Set objGroup=GetObject("LDAP://"&grp) Const E_ADS_PROPERTY_NOT_FOUND = &h8000500D descr="" descr=objGroup.Get("info") If err.number <> E_ADS_PROPERTY_NOT_FOUND Then if (left(descr,1)="(") then size=size+1 pos=InStr(descr,")") letters=mid(descr,2,pos-2) path=mid(descr,pos+1) drv=GetFreeDrive(letters) Groups(size,1)=drv Groups(size,2)=path end if End If next dim Data redim Data(size,2) for i=1 to size Data(i,1)=Groups(i,1) Data(i,2)=Groups(i,2) next GetMountArray=data end function rem ------------------------------------------------------------ rem ------------------------------------------------------------ rem ParseVariables функция поиска переменных в строке и подстановки значений. rem возвращает обработанную строку rem ------------------------------------------------------------ function ParseVariables(strLine) set objNet=CreateObject("wscript.network") str=replace(lcase(strLine),"%username%",objNet.UserName) str=replace(str,"%computername%",objNet.ComputerName) ParseVariables=str end function Нужно ли в нем еще что то менять? Могу ли я его просто вставить в групповую политику в сценария на пользователя в вход ? Спасибо) |
Автор: a84427 05.06.09, 07:12 |
Здравствуйте.. Вот скрипт который пингует хост и по качеству пинга выключает и включает сеть |
Автор: Спящий 06.07.09, 13:58 |
Есть у кого внятные примеры работы с ODBC на VBScript/JScript? |
Автор: AlexJ 06.07.09, 15:54 |
Сообщение N-22 в этой теме |
Автор: Спящий 06.07.09, 16:12 |
Уже нашел. Не надо. |
Автор: viki1976 09.07.09, 13:10 |
Есть интересная задача , которую хотелось бы решить централизованно с помощью скриптов , а именно : Создание профиля пользователя на локальной машине. Скоро у меня грядет перестановка домена , скрипты для выброса машин из домена, переименование профиля пользователя на локальной машине(к сожалению нет возможности использовать перемещаемые профили), создание всей AD, и присоединение всех машин к новому домену с последующей перезагрузкой я худо бедно написал , а с этой задачей даже не знаю с какого конца начать ... Если у кого был опыт разработки подобного или может натолкнете на мысль ... Заранее благодарен . |
Автор: zshurik 22.07.09, 06:19 |
Цитата viki1976 @ Есть интересная задача , которую хотелось бы решить централизованно с помощью скриптов , а именно : Создание профиля пользователя на локальной машине. Скоро у меня грядет перестановка домена , скрипты для выброса машин из домена, переименование профиля пользователя на локальной машине(к сожалению нет возможности использовать перемещаемые профили), создание всей AD, и присоединение всех машин к новому домену с последующей перезагрузкой я худо бедно написал , а с этой задачей даже не знаю с какого конца начать ... Если у кого был опыт разработки подобного или может натолкнете на мысль ... Заранее благодарен . Есть утилита от sysinternals называется moveuser.exe. Работает в командной строке, позволяет премещать настроенный профиль пользователя на тот который нужно, проверенно работает корректно. Таким образом переводил своих юзверей на домен с новеля. К сожалению скрипта готового не осталось, было это года 2 назад |
Автор: Akina 15.09.09, 20:19 |
К слову о скриптах, в частности об использовании WMI. Теперь в дополнение к Scriptomatic2 появился не менее удобный WMICodeCreator. Обе тулзы свободно берутся на сайте Майкрософт. |
Автор: Alexsz 16.09.09, 08:52 |
Здравствуйте! Подскажите пожалуйста, как реализовать изменение ip адреса сетевого адаптера через wmi? (на vbs) <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colNetAdapters = objWMIService.ExecQuery _ ("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE") strIPAddress = Array("192.168.0.3") strSubnetMask = Array("255.255.255.255") strGateway = Array("192.168.1.100") strGatewayMetric = Array(1) For Each objNetAdapter in colNetAdapters errEnable = objNetAdapter.EnableStatic(strIPAddress, strSubnetMask) errGateways = objNetAdapter.SetGateways(strGateway, strGatewaymetric) arrDNSServers = Array("192.168.1.100", "192.168.1.200") objNetAdapter.SetDNSServerSearchOrder(arrDNSServers) Next Этот скрипт работает, но, он меняет все параметры, маску, шлюз и днс. Как можно сделать чтобы этот скрипт менял ТОЛЬКО ip? Ситуация - машина в сети, только разлилась и получила от dhcp ip,mask,gateway,dns. Нужно при сохранении mask,gateway,dns (выданных dns-ом) изменить в ip адресе последний разряд (пример - 192.168.ххх.ххх - ххх.ххх нужно поменять) |
Автор: Akina 16.09.09, 09:06 |
Цитата Alexsz @ машина в сети, только разлилась и получила от dhcp ip,mask,gateway,dns. Нужно при сохранении mask,gateway,dns (выданных dns-ом) изменить в ip адресе последний разряд Изменить только адрес невозможно - смена dhcp на static делает все параметры соединения невалидными. Следует сохранить полученные по DHCP параметры и затем присвоить весь пакет параметров (изменить адрес, сохранить остальное) в static-конфигурации. |
Автор: Alexsz 16.09.09, 09:11 |
Цитата Akina @ Цитата Изменить только адрес невозможно - смена dhcp на static делает все параметры соединения невалидными. Следует сохранить полученные по DHCP параметры и затем присвоить весь пакет параметров (изменить адрес, сохранить остальное) в static-конфигурации. ОК, а как реализовать сие? (сохранить и т.д.) Я немного не представляю как Цитата присвоить весь пакет параметров (изменить адрес, сохранить остальное) в static-конфигурации. Help! |
Автор: Akina 16.09.09, 09:53 |
Ну у тебя же всё есть!!! ты же присваиваешь параметры - неужели так сложно сначала считать их значения и сохранить в переменной? |
Автор: Alexsz 16.09.09, 11:04 |
Цитата Ну у тебя же всё есть!!! ты же присваиваешь параметры - неужели так сложно сначала считать их значения и сохранить в переменной? Ув Akina! Помогите плз реализовать в скрипте, у меня недостаточно знаний |
Автор: Akina 16.09.09, 12:08 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colNetAdapters = objWMIService.ExecQuery ("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE and DHCPEnabled=TRUE") strIPAddress = Array("192.168.0.3") For Each objNetAdapter in colNetAdapters If Left(objNetAdapter.IPAddress,7) = Left(strIPAddress,7) Then strSubnetMask = objNetAdapter.IPSubnet strGateway = objNetAdapter.DefaultIPGateway strGatewayMetric = objNetAdapter.GatewayCostMetric arrDNSServers = objNetAdapter.DNSServerSearchOrder errEnable = objNetAdapter.EnableStatic(strIPAddress, strSubnetMask) errGateways = objNetAdapter.SetGateways(strGateway, strGatewaymetric) objNetAdapter.SetDNSServerSearchOrder(arrDNSServers) End If Next |
Автор: Alexsz 16.09.09, 12:34 |
Цитата Akina Теперь ясно чего я не понимал)) Я не понимал как сделать strSubnetMask = objNetAdapter.IPSubnet! Ну и про "and DHCPEnabled=TRUE" я также недодумался! Akina Моск! Спасибо Вам! Добавлено Цитата strIPAddress = Array("192.168.0.3") Ув. Akina А можно сделать чтобы адрес менялся не полностью (192.168.0.3) а 192.168.xхх.211, т.е. чтобы предпоследний октет скрипт генерировал в соответствии с тем, как настроена ЛВС? (или чтобы скрипт брал текущий ip и менял только его последний октет (т.е. менял 192.168.0.ХХХ)_) |
Автор: Akina 16.09.09, 13:24 |
А в чём проблема? не можете найти справку по строковым функциям в VBScript? http://msdn.microsoft.com/en-us/library/3ca8tfek(VS.85).aspx |
Автор: Alexsz 16.09.09, 13:52 |
Цитата А в чём проблема? Проблема в знаниях Благодаря Вам нашел справку, нашел такое решение: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> sip = getip() ifirstdot = instr(0,sip,".") iseconddot = instr(ifirstdot+1,sip,".") ithirddot = instr(iseconddot+1,sip,".") strirdoctet = mid(sip, iseconddot+1, _ Len(sip)-ithirddot) Function getip() set myobj = getobject("winmgmts:{impersonationlevel=" & "impersonate}") "!//localhost".execquery ("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE") for each ipadress in myobj if ipaddress.ipaddress(0) <> "0.0.0.0" then localip = ipaddress.ipaddress(0) exit for end if next getip = localip end function Эм, оно "нерабочее" в моменте присвоения Myobj = getobj, немогу понять что не так? Будте любезны, если сможете решить мою проблему, запостите код пожалуйста.. ( по строковым ф-циям почему например при dim a & a = array(192,168,0,191) & b = a(4) & msgbox b в ответ приходит ошибка? ..) |
Автор: Akina 16.09.09, 14:14 |
Вместо использования instr посмотрите описания функций Split и Join. Ошибка синтаксиса. Цитата Alexsz @ по строковым ф-циям почему например при dim a & a = array(192,168,0,191) & b = a(4) & msgbox b в ответ приходит ошибка? Во-первых, тут нет строковых функций. Во-вторых, все массивы zero-based. Ну так изучайте язык, но на более простом материале. |
Автор: Alexsz 17.09.09, 05:45 |
To Akina Я пытаюсь понять, на более простом примере у меня все получается, однако именно в этом случае проблемы, благодаря Вам, Akina, я пытаюсь их решить. Получилось следующее: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colNetAdapters = objWMIService.ExecQuery ("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE and DHCPEnabled=TRUE") ArrIpAddress = array("192.168.0.3") For Each objNetAdapter in colNetAdapters for each straddress in objnetadapter.ipaddress arroctet = split(straddress, ".") if arroctet(0) = "10" and arroctet(1) = "10" then strnewaddress = "192.168." & arroctets(2) & "." & arroctets(3) arripaddress = array(strnewaddress) strSubnetMask = objNetAdapter.IPSubnet strGateway = objNetAdapter.DefaultIPGateway strGatewayMetric = objNetAdapter.GatewayCostMetric arrDNSServers = objNetAdapter.DNSServerSearchOrder arrEnable = objNetAdapter.EnableStatic(arrIPAddress, strSubnetMask) errGateways = objNetAdapter.SetGateways(strGateway, strGatewaymetric) objNetAdapter.SetDNSServerSearchOrder(arrDNSServers) End If Next next if err.number<>0 then wscript.echo err.number, err.description err.Clear end if Скрипт отрабатывает без ошибок но не меняет никаких параметров (ip,mask,gtw,dns..) Где я ошибся? Помогите пожалуйста Понять.. |
Автор: Alexsz 17.09.09, 11:08 |
Еще раз спасибо Akina за то что изначально направил меня в нужное русло!:) Итоговый рабочий самописный скрипт: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colNetAdapters = objWMIService.ExecQuery ("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE and DHCPEnabled=TRUE") For Each objNetAdapter in colNetAdapters For Each strAddress in objNetAdapter.IPAddress arrOctets = Split(strAddress, ".") If arrOctets(0) and arrOctets(1) Then strNewAddress = arroctets(0) & "." & arroctets(1) & "." & arrOctets(2) & "." & "211" arrIPAddress = Array(strNewAddress) strSubnetMask = objNetAdapter.IPSubnet strGateway = objNetAdapter.DefaultIPGateway strGatewayMetric = objNetAdapter.GatewayCostMetric arrDNSServers = objNetAdapter.DNSServerSearchOrder errEnable = objNetAdapter.EnableStatic(arrIPAddress, strSubnetMask) errGateways = objNetAdapter.SetGateways(strGateway, strGatewaymetric) objNetAdapter.SetDNSServerSearchOrder(arrDNSServers) End If Next Next В конце можно при желании прикрутить ребут машины..) |
Автор: Akina 18.09.09, 11:01 |
А смысл? достаточно опустить и снова поднять интерфейс - а на ХР и старше так и вовсе ничего не нужно, применяется на лету. Единственный минус такого подхода - не сбрасывается резервирование адреса на DHCP-сервере. Плюс некоторое время висит фантом в НетБИОС-окружении. |
Автор: AlexJ 18.09.09, 16:27 |
Цитата Akina @ Единственный минус такого подхода - не сбрасывается резервирование адреса на DHCP-сервере. Akina абсолютно прав, и плюс ко всему даже после перезагрузки перезагрузки ИПшник не сброситься, не видел я чтоб сброс кэша DHCP был меньше 15 минут, а обычно неделя или больше. "Сбить" DHCP сервак можно только сменив МАС адрес сетевухи или "вписаться" самому в протокол DHCP и отвергать предложения сервака получить "старый" ИП. |
Автор: Akina 18.09.09, 17:31 |
Вообще-то это определяется параметром Leased Time самогО DHCP-сервера. |
Автор: AlexJ 21.09.09, 01:27 |
Ну так о нем и говорю, редко кто ставит меньше 15 минут, а обычно все ставят неделю, после чего кэш DHCP сервака сбрасывается, если не было больше подключений с определенного МАС-адреса. |
Автор: Alexsz 21.09.09, 13:18 |
Akina А если сбросить командой netsh winsock reset? Тогда этот самый фантом исчезнет? |
Автор: Akina 21.09.09, 14:02 |
Если сбросить на мастер-браузере и на рабстанции - да. Сообщения были разделены в тему "Скрипт для биллинга" |
Автор: Alexsz 13.10.09, 11:48 |
Здравствуйте! Имеется следующий скрипт: (выводит свободное дисковое пространтсво) <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> on Error resume Next stringx = "Локальные диски" & vbNewLine & vbNewLine Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set WSHShell = WScript.CreateObject("WScript.Shell") 'Проверяем все драйвы (HDD, FDD, CDD) в системе For each i In fso.Drives If i.DriveType=1 Then If i<>"A:" Then freef = frit(i) End If End If If i.DriveType=2 Then free=frit(i) stringx= stringx & " На диске " & i & " свободно " & free & " Мб " & vbNewLine End If Next stringx = stringx WSHShell.Popup(stringx) WScript.Quit() function frit(gg) frit = FormatNumber(fso.GetDrive(gg.DriveLetter).FreeSpace/1048576, 1) End function Вопрос: что модифицировать нужно,чтобы скрипт выводил данные в процентах? И как сделать чтобы при превышении определенного порога % свободного пространства скрипт отсылал предупреждающее ( о том что, допустим, на системном диске 0% свободно) сообщение на мыло? |
Автор: Akina 13.10.09, 12:02 |
Получить не только объём свободного пространства (FreeSpace), но и полный объём (TotalSize). Поделить одно на другое. Умножить на 100. Добавить в конце символ "%". Цитата Alexsz @ как сделать чтобы при превышении определенного порога % свободного пространства скрипт отсылал предупреждающее ( о том что, допустим, на системном диске 0% свободно) сообщение на мыло? Задействовать SimpleMAPI. См. "Microsoft Collaboration Data Objects Programmer's Reference" в MSDN. |
Автор: Alexsz 15.10.09, 12:25 |
Спасибо Akina за совет! Получилось следующее: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Const AlertHigh = .9 Const emailFrom = "xx@xxx.ru" Const emailTo = "xx@xxx.ru" Const MailServer = "mail.xxx.ru" Const WaitTimeInMinutes = 1 Dim strMessage Dim arrServerList arrServerList = array("server name") Do until i = 2 strMessage = "" PollServers(arrServerList) if strMessage <> "" then EmailAlert(strMessage) end if WScript.Sleep(WaitTimeInMinutes*60000) Loop Sub PollServers(arrServers) on error resume next for each Server in arrServers set objSvc = GetObject("winmgmts:{impersonationLevel=impersonate}//" & Server & "/root/cimv2") set objRet = objSvc.InstancesOf("win32_LogicalDisk") for each item in objRet if item.DriveType = 7 then end if if item.FreeSpace/item.size <= AlertHigh then strMessage = strMessage & UCase(Server) & ": Alert, drive '" & item.caption & "' is low on HDD space! There are " & FormatNumber((item.FreeSpace/1024000),0) & " MB free <7%" & vbCRLF end if next next set objSvc = Nothing set objRet = Nothing End Sub Sub EmailAlert(Message) on error resume next Set objMessage = CreateObject("CDO.Message") with objMessage .From = emailFrom .To = emailTo .Subject = "Low Disk Space Update" .TextBody = Message .Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 .Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = MailServer .Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasic .Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = "xxx" .Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "xxx" .Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 .Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False .Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60 .Configuration.Fields.Update .Send end with Set objMessage = Nothing End Sub Подскажите пожалуйста, как написать скрипт, который содавал бы файл и постоянно записывал туда текстовую информацию (вообще не важно какую), главное чтобы скрипт записывал инфу постоянно, тем самым увеличивая (постоянно) размер файла..? (нужно для того чтобы протестировать данный скрипт) |
Автор: Akina 15.10.09, 12:37 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Есссно предусмотри, как завершать работу скрипта - не снимать же процесс... Sub WriteDataToFile(FullFileName, TextToWrite) Const ForReading = 1, ForWriting = 2, ForAppending = 8 Dim fso, f Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile(FullFileName, ForAppending, True) f.Write TextToWrite f.Close End Sub Do Call WriteDataToFile("c:\logfile.txt", "Test String") WScript.Sleep(60000) Loop |
Автор: Chingizhan 23.10.09, 10:14 |
Всем Привет!!! Столкнулся с потребностью удаления определенного файла у пользователей. Суть такая, место положение файла известно, он может находится в одном из трех мест (на каждой машине находится по разному, но всегда в одном из этих трех мест), имя файла также известно, нужно что бы этот файл удалялся, лучше конечно через какой-то промежуток времени, либо по завершению сеанса пользователя. Буду очень благодарен за скрипт! Да и так думаю скрипт будет актуален для многих админов. |
Автор: Chingizhan 23.10.09, 10:17 |
Еще бы очень нужный скриптик, который бы формировал файл с именами пользователей и паролей в домена. |
Автор: Akina 23.10.09, 10:18 |
Однозначно нет. А вот для ломастеров - да. Вот прям готовый тебе вынь да положь? так ты разделом ошибся, тебе в ПОМОЩЬ СТУДЕНТАМ А если всё-таки намерен делать сам- показывай, что уже сделано и в чём возникла проблема. |
Автор: 3dmaxxx 10.11.09, 20:35 |
ConnectServer(Edit1.Text, 'root\CIMV2', ... В указанной выше строке данные беруться из поля Edit1.Text. Если в поле введено не верное имя компьютера или ПК в данный момент не включен или WMI служба на нём не запущена...-- Всё это ведёт к сбою подключения с последующей остановкой программы. Обработчики ошибок не помогают... Как заранее проверить, что указанная строка даст либо не даст добро на работу? |
Автор: 3dmaxxx 11.11.09, 14:28 |
Мой вопрос на сто миллионов долларов? WMI-- мощная штука, а элементарных вещей делать не может... |
Автор: Akina 11.11.09, 18:10 |
Используй SWbemLocator.ConnectServer, а не IWbemLocator.ConnectServer |
Автор: 3dmaxxx 11.11.09, 22:17 |
В общем-то я и использую SWbemLocator. В случае не большой ошибки сети или ещё чего, даже при обращении к машине у которой все необходимые службы активны, часто программа прерывается с ошибкой: "Сервер RPC не доступен". Эсли действительно способа заведомой проверки у WMI связи нет, то Microsoft здесь облажалась. Главное везде в своём MSDN, перед выполнением каких-либо операций, например, доступа к файлу, прежде всего проверяют его наличие а здесь не в менее серьёзном сбое при не возможности установить WMI-связь, буд-то бы так и надо... |
Автор: Alexsz 18.11.09, 07:29 |
Здравствуйте! Подскажите пожалуйста, имеется следующий код: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim strMessage Dim fso, arch, backup Set fso = CreateObject("Scripting.FileSystemObject") Set arch = fso.OpenTextFile("C:\check free space\Log\Archiving.log", ForReading) Ar = arch.ReadAll arch.Close StrMessage = StrMessage & "<p> Лог файл BackupDB: </p>" & "<table border = 1> <tr><td>"& Ar &" <br></td></tr></table>" Этот скрипт рассылает сообщение (оформленное как .htmlBody), вопрос - скрипт берет данные из текстового файла, как их вывести в html построчно? Просто если оставить как есть, то скрипт выведет информацию с Archiving.log одной строкой... ? (вариант вставить теги <br> в лог файл некатит, ибо то, что выводит лог не умеет вставлять теги, а каждый день вбивать в лог файл теги это сооовсем не вариант) П.С. Подумав сделал так: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim strMessage Dim fso, objFSO, arch, backup, arrlin, strlin Set fso = CreateObject("Scripting.FileSystemObject") Set objFSO = CreateObject("Scripting.FileSystemObject") Set arch = fso.OpenTextFile("C:\check free space\Log\Archiving.log", ForReading) Ar = arch.ReadAll arch.Close arrlin = split(Ar, vbCrLf) for each Ar in arrlin next StrMessage = StrMessage & "<p> Лог файл BackupDB: </p>" & "<table border=1 align=center><tr><td>"& Ar &"</td></tr></table>" Если после for each Ar in arrlin добавить wscript.echo Ar то попапами выведется построчно инфа с файла Archiving.log. Но если все оставить как указано в коде, без эхо, то в отсылаемом письме придет только пустая рамка от таблицы, т.е. содержимое файла Archiving.log почему то не желает выводится в тело письма! Куда рыть??? |
Автор: Akina 18.11.09, 09:41 |
Использовать Replace и заменить vbNewLine на "<br>" |
Автор: Alexsz 18.11.09, 09:56 |
Ткните пожалуйста, куда Replace вставить? И что заменять нужно.. П.С. vbNewLine = vbCrLf? |
Автор: Akina 18.11.09, 10:02 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> StrMessage = StrMessage & "<p> Лог файл BackupDB: </p>" & "<table border = 1> <tr><td>"& Replace(Ar,vbCrLf,"<br>") &" <br></td></tr></table>" |
Автор: Alexsz 18.11.09, 10:13 |
аааа! а я копал в другом направлении)) Спасибо, все понял! Вывод в StrMessage я и не трогал... ппц.. Спасибо Аkina! |
Автор: blackangel 23.11.09, 14:26 |
Уважаемые, подскажите плз, как установить msi пакет на удаленную машину ПРИ ПОМОЩИ VBS? Все дело естественно в домене. |
Автор: Akina 23.11.09, 18:11 |
silent? или требуется интерактивное управление пакетом? |
Автор: blackangel 24.11.09, 09:50 |
Silent. Скрипт запускаем на контроллере домена и он устанавливает пакет на нужные машины. |
Автор: BlackGod 25.11.09, 09:01 |
Здравствуйте =) помогите со скриптом, который собирал бы в домене информацию о компьютерах пользователей и записывал её в файл (имя компьютера - название файла) вот такой структурой: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> [Info] MAC_Addr= Current_User_Name= ИМЯ_ПОЛЬЗОВАТЕЛЯ Computer_Name=ИМЯ_КОМПЬЮТЕРА IP_Addr=IP_АДРЕС_КОМПЬЮТЕРА Host: ИМЯ_КОМПЬЮТЕРА System=Windows XP build 2600/Service Pack 1,Русский Param_0= Param_1=ИМЯ_ПОЛЬЗОВАТЕЛЯ Record_Date=28.04.2009 [Computer] BIOS= CPU_Freq_in_MHz= CPU= Memory_in_Mb= Total_HDD_in_Mb= ИМЯ_ПОЛЬЗОВАТЕЛЯ, ИМЯ_КОМПЬЮТЕРА и IP_АДРЕС_КОМПЬЮТЕРА это в принципе основное в этом файле.. если и другое впихнётся, то я не против буду =) з.ы. вообще это возможно по средством скриптов?) |
Автор: Alexsz 25.11.09, 09:13 |
BlackGod Например: (узнаем имя пк) WshNetwork = CreateObject("WScript.Network") WshNetwork.ComputerName Ну и далее смотрите что Вам нужно в скрипте.. |
Автор: BlackGod 25.11.09, 09:46 |
Цитата Alexsz @ BlackGod Например: (узнаем имя пк) WshNetwork = CreateObject("WScript.Network") WshNetwork.ComputerName Ну и далее смотрите что Вам нужно в скрипте.. к сожалению в скриптах не силён... |
Автор: Alexsz 25.11.09, 10:14 |
strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colItems = objWMIService.ExecQuery _ ("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True") For Each objItem in colItems Wscript.Echo objItem.MACAddress For Each strAddress in objItem.IPAddress Wscript.Echo strAddress Next Next Выводит попапом мак и ип текущего пк Имя пользователя см имя пк, все по анологии, cpu, mem и hdd берите через wmi И еще, тут никто за Вас писать скрипты не будет, предлагайте скрипт, написанный Вами, будем думать! |
Автор: BlackGod 25.11.09, 10:27 |
Цитата Alexsz @ И еще, тут никто за Вас писать скрипты не будет, предлагайте скрипт, написанный Вами, будем думать! а знаю... з.ы. есть скриптик, который при запуске с параметром (IP или имя компьютера) устанавливает сервер R_Admin'a на машину... если надо, то могу и так дать... Вообще есть немного скриптов, но я думаю, что большинство встречается тут.. |
Автор: Alexsz 25.11.09, 10:47 |
BlackGod Мне ненадо такой скрипт, ибо сам могу написать. Включайте логику и вперед, хотя бы куски кода предлагайте! з.ы. погуглите, чтоли.. |
Автор: BlackGod 25.11.09, 15:57 |
Alexsz спасибо =) |
Автор: 3dmaxxx 27.11.09, 22:08 |
Мне нужно внутри одного скрипта выполнить другой, не явно указанный. Например, в обычном HTML-интегрированном скрипте это можно было сделать методом write[ln] объекта document... Есть подобная возможность в WSH? |
Автор: Akina 28.11.09, 05:37 |
CallByName или его аналога в WSH нет. |
Автор: 3dmaxxx 28.11.09, 09:25 |
CallByName возращает 0 или 1. А может она как-нибудь возратить ссылку на новый объект, создаваемый методом,-- вызывающийся из CallByName. PS Как можно зашифровать исходный код скрипта так, что бы он был не читаем для человека, но рабочим для машины? |
Автор: Alexsz 28.11.09, 10:06 |
3dmaxxx Зашифровать можно переведя скрипт в exe, гуглите на тему vbs2exe.. |
Автор: Alexsz 21.12.09, 11:51 |
Здравствуйте! Имеется следующая задача: Есть список логинов (юзвери), нужно проверить эти логины на соответствие их в AD (т.е. не все из этих логинов существуют в AD(некоторых допустим уволили но в списке они есть а в AD нету уже). Как сие организовать? Как организовать вывод логинов которых скрипт не нашел в AD?(думаю нужно вывести их в отдельный txt).. Подскажите куда рыть... |
Автор: Dmitrii 22.12.09, 05:38 |
1. Речь именно о "логинах" (т.е. об атрибуте схемы userPrincipalName)? 2. Откуда возмётся список, который надо сопоставлять с содержимым AD? 3. Версия сервера? |
Автор: Alexsz 22.12.09, 07:04 |
Dmitrii 1.2. Список логинов берется с 3-х мест на сервере: папка с профилями юзеров usrdata (50 на 50,активные и неактивные), папка с профилями userdata (50 на 50,активные и неактивные), папка с профилями roaming (перемещаемые профили). Брать список юзверей нужно именно с этих папок и сопоставлять с AD. Список можно получить, например, так: dir /ad /b > users.txt 3.2003 r2 sp2 |
Автор: Dmitrii 22.12.09, 07:53 |
Alexsz, первый вопрос остался без ответа. Повторяю его в иной форме. Какой атрибут схемы AD подразумевается под словом "логин": userPrincipalName, sAMAccountName, displayName, какой-то другой..? |
Автор: Alexsz 22.12.09, 08:05 |
Dmitrii userPrincipalName атрибут, первый ваш пост немного не понял..) |
Автор: Dmitrii 22.12.09, 11:42 |
Alexsz, попробуйте так: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim objFS, objItem, objFile, objDict, arrFolders, strTemp Dim objRoot, strDomain Dim objConnection, objCommand, objRSet, strCmdText Const strResFile = "C:\Absent.txt" Set objDict = CreateObject("Scripting.Dictionary") objDict.CompareMode = 1 '=== Не забудьте правильно задать содержимое массива arrFolders arrFolders = Array("x:\usrdata", "y:\userdata", "z:\roaming") '=== Set objFS = CreateObject("Scripting.FileSystemObject") For i = 0 To UBound(arrFolders) If objFS.FolderExists(arrFolders(i)) Then For Each objItem In objFS.GetFolder(arrFolders(i)).SubFolders strTemp = objItem.Name If Not objDict.Exists(strTemp) Then objDict.Add strTemp, False End If Next End If Next If objDict.Count > 0 Then Set objRoot = GetObject("LDAP://RootDSE") strDomain = objRoot.Get("DefaultNamingContext") Set objRoot = Nothing strCmdText = "<LDAP://" & strDomain & ">;(&(objectCategory=Person)(objectClass=User));userPrincipalName;Subtree" Set objConnection = CreateObject("ADODB.Connection") objConnection.Provider = "ADsDSOObject" objConnection.Open "Active Directory Provider" Set objCommand = CreateObject("ADODB.Command") Set objCommand.ActiveConnection = objConnection objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 objCommand.CommandText = strCmdText Set objRSet = objCommand.Execute objRSet.MoveFirst Do Until objRSet.EOF strTemp = objRSet.Fields(0).Value If objDict.Exists(strTemp) Then objDict.Item(strTemp) = True End If objRSet.MoveNext Loop Set objRSet = Nothing Set objCommand = Nothing Set objConnection = Nothing strTemp = vbNullString For Each objItem In objDict.Keys If Not objDict.Item(objItem) Then strTemp = strTemp & objItem & vbNewLine End If Next Set objFile = objFS.CreateTextFile(strResFile, True) objFile.Write strTemp objFile.Close Set objFile = Nothing WScript.Echo "Готово." Else WScript.Echo "Список пользователей пуст." End If Set objFS = Nothing Set objDict = Nothing WScript.Quit 0 |
Автор: AlexCray 15.01.10, 15:07 |
Доброго дня! Ни у кого не завалялось скрипта, копирующего некую иерархию каталогов, с файлами, по сети с сохранением прав доступа пользователей ActiveDirectory? |
Автор: pride.psy 04.02.10, 17:27 |
Доброго времени суток! Ребят, выручите, нужен скрипт, перемещающий отключенных или неактивных в течении определенного количества дней пользователей и компьютеров в AD в отдельное подразделение. Спасиб заранее. |
Автор: Dmitrii 05.02.10, 13:57 |
Цитата pride.psy @ Пример сценария для перемещения отключенных "учёток" пользователей и компьютеров в отдельное подразделение (предполагается, что оно уже существует в AD):нужен скрипт, перемещающий отключенных ... пользователей и компьютеров в AD в отдельное подразделение <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Public objTargetOU Public strUsers, strComputers, strTargetOU Public Const strNoMoved = "krbtgt;Гость" 'Пример списка отключенных "учёток", которые не надо перемещать Dim objRoot, objContainer, objItem Dim objFS, objFile Dim strDomain, strTemp Const strFile = "C:\Disabled_Users_and_Computers.txt" strTargetOU = "LDAP://OU=Отключенные и неиспользуемые," Set objRoot = GetObject("LDAP://rootDSE") strDomain = objRoot.Get("defaultNamingContext") Set objContainer = GetObject("LDAP://" & strDomain) strTargetOU = strTargetOU & strDomain Set objRoot = Nothing Set objTargetOU = GetObject(strTargetOU) For Each objItem In objContainer strTemp = objItem.Class If StrComp(strTemp, "organizationalUnit", vbTextCompare) = 0 Or _ StrComp(strTemp, "container", vbTextCompare) = 0 Then Call Get_Members(objItem) End If Next Set objItem = Nothing Set objContainer = Nothing Set objFS = CreateObject("Scripting.FileSystemObject") Set objFile = objFS.CreateTextFile(strFile, True) objFile.WriteLine strUsers & vbNewLine & "=====" & vbNewLine & vbNewLine & strComputers objFile.Close Set objFile = Nothing Set objFS = Nothing WScript.Echo "Готово." WScript.Quit 0 '=== Function Get_Members(objOU) Dim objItem, objIADs, strTemp If StrComp(objOU.ADsPath, strTargetOU, vbTextCompare) <> 0 Then For Each objItem In objOU strTemp = objItem.Class If StrComp(strTemp, "computer", vbTextCompare) = 0 Then Set objIADs = GetObject(objItem.ADsPath) If objIADs.AccountDisabled Then strComputers = strComputers & objIADs.ADsPath & vbNewLine objTargetOU.MoveHere objIADs.ADsPath, vbNullString End If Set objIADs = Nothing Else If StrComp(strTemp, "user", vbTextCompare) = 0 Then If Instr(1, strNoMoved, objItem.cn, vbTextCompare) = 0 Then Set objIADs = GetObject(objItem.ADsPath) If objIADs.AccountDisabled Then strUsers = strUsers & objIADs.ADsPath & vbNewLine objTargetOU.MoveHere objIADs.ADsPath, vbNullString End If Set objIADs = Nothing End If Else If StrComp(strTemp, "organizationalUnit", vbTextCompare) = 0 Or _ StrComp(strTemp, "container", vbTextCompare) = 0 Then Call Get_Members(objItem) End If End If End If Next Set objItem = Nothing End If End Function Для определения "учёток", не проявляющих активности в течение заданного времени, вычисляйте разницу между текущей датой и значением атрибута LastLogin объекта типа "Пользователь". Учтите, что это не реплицируемый атрибут, поэтому в мультиконтроллерном домене надо опросить все контроллеры и выбрать наиболее "свежую" дату из полученных. |
Автор: arr1val 19.02.10, 13:09 |
Подскажите как изменить скрипт приведенный выше по теме: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colNetAdapters = objWMIService.ExecQuery ("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE and DHCPEnabled=TRUE") For Each objNetAdapter in colNetAdapters For Each strAddress in objNetAdapter.IPAddress arrOctets = Split(strAddress, ".") If arrOctets(0) and arrOctets(1) Then strNewAddress = arroctets(0) & "." & arroctets(1) & "." & arrOctets(2) & "." & "211" arrIPAddress = Array(strNewAddress) strSubnetMask = objNetAdapter.IPSubnet strGateway = objNetAdapter.DefaultIPGateway strGatewayMetric = objNetAdapter.GatewayCostMetric arrDNSServers = objNetAdapter.DNSServerSearchOrder errEnable = objNetAdapter.EnableStatic(arrIPAddress, strSubnetMask) errGateways = objNetAdapter.SetGateways(strGateway, strGatewaymetric) objNetAdapter.SetDNSServerSearchOrder(arrDNSServers) End If Next Next чтобы он менял все (маску, dns, wins, gateway), кроме айпишника, который и так уже статично задан. Заранее большое спасибо. ---------------------------------------- Пришли сами к такому решению: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colNetAdapters = objWMIService.ExecQuery _ ("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE") strSubnetMask = "255.255.248.0" For Each objNetAdapter in colNetAdapters strIPAddress = CStr(objNetAdapter.IPAddress(0)) errEnable = objNetAdapter.EnableStatic(Array(strIPAddress), Array(strSubnetMask)) Next |
Автор: blackangel 01.03.10, 10:43 |
Подскажите пожалуйста, как запустить два процесса параллельно? А именно нужно вот что: Устанавливаю апдейты для Винды на удаленной машине след образом <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> RetCode = WshShell.Run("d:\psexec.exe \\comp1 -s \\server\enu\windowsXP-KB957097-x86.exe /quiet /norestart", 1, True) MsgBox "Обновление завершено! Код возврата - " & RetCode В первой строке происходит обновление, а затем, когда обновление закончится выводится сообщение с кодом возврата(успешно выполнена установка или нет). Таким образом можно ПООЧЕРЕДНО устанавливать на все компы организации нужное обновление... Господа! Как запустить эти процессы параллельно на нескольких компьютерах и от каждого процесса получить код возврата?? Знаю, что есть асинхронные и полусинхронные вызовы, но ка реализовать не знаю((( Или может есть другие способы? Помогите плз.. |
Автор: Akina 01.03.10, 13:47 |
Ммм... WaitForSingleObject/WaitForSingleObjectEx... но вот как это в скрипте - навскидку не сообразится что-то. |
Автор: blackangel 01.03.10, 15:07 |
Цитата Akina @ Ммм... WaitForSingleObject/WaitForSingleObjectEx... но вот как это в скрипте - навскидку не сообразится что-то. эххх:(( буду продолжать ломать голову. |
Автор: -=CAP=- 01.03.10, 15:35 |
blackangel, попробуй написать еще один скрипт, который будет вызывать твой скрипт с параметром CompName столько раз, на сколько компов надо проинсталить. Только при вызове твоего скрипта не ждать его завершения. В результате ты получишь много окошек с результатами выполнения |
Автор: Dmitrii 02.03.10, 06:29 |
Цитата blackangel @ И из запускаемых процессов, и из их откликов будут выстраиваться очереди, хотим мы того или не хотим. Но так как отклики могут приходить асинхронно, то и обрабатывать их можно в асинхронном режиме. Использовать для этого можно механизмы WMI.... как запустить два процесса параллельно? ... есть асинхронные и полусинхронные вызовы, но ка реализовать не знаю... Поищите материал по ключам: SWbemSink, ExecQueryAsync, Sink_OnObjectReady (более деятельно сейчас помочь Вам ничем не могу). |
Автор: Kevin-Nash 19.03.10, 10:26 |
Доброго времени суток! Хочу обратиться к вам за советом или помощью - С WMI еще дела иметь не приходилось, опыта, соответственно нет. Задача следующая: Есть группа компьютеров с Windows XP Professional SP3, объединенных в одноранговую сеть и распределенных по территории компании. Есть "рабочая станция администратора". Для компьютеров существует некая задача распределенных вычислений. Нужно: с рабочей станции администратора инициировать локальный вход на группе компьютеров(имя-пароль пользователя известны) и запустить на них некое приложение. Возможно ли сделать такое средствами WMI и в какую сторону копать? |
Автор: Dmitrii 24.03.10, 08:22 |
Цитата Kevin-Nash @ Стандартными средствами сценариев (в том числе и с помощью WMI) этого сделать нельзя. ... с рабочей станции администратора инициировать локальный вход на группе компьютеров(имя-пароль пользователя известны)... |
Автор: agem 25.03.10, 09:28 |
Реализация возможности просмотра подключений флешек в домене. Создаем файл usb.mof <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> #pragma namespace ("\\\\.\\root\\subscription") instance of ActiveScriptEventConsumer as $CONSUMER { Name = "MyStandardConsumer"; KillTimeout = 300; ScriptingEngine = "VBScript"; ScriptFileName = "\\\\computername\\folder\\usb.vbs"; //путь к скрипту для события "появился съемный диск" }; instance of __EventFilter as $FILTER { Name = "MyRemDevFilter"; Query = "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE TargetInstance ISA " "\"Win32_LogicalDisk\" AND TargetInstance.DriveType = 2" ; QueryLanguage = "WQL"; EventNamespace = "root\\CIMv2"; }; instance of __FilterToConsumerBinding { Consumer = $CONSUMER; Filter = $FILTER; }; файл usb.vbs <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim objFSO, objFile, WshNetwork Set objFSO = CreateObject ("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile ("\\computername\folder\Scriptlog.txt", 8, true) //путь к файлу, куда пишутся логи Set WshNetwork = CreateObject("WScript.Network") objFile.WriteLine "Time: " & Now & "; Entry made by ASEC" objFile.WriteLine "Script Started for USB Drive: " & TargetEvent.TargetInstance.Caption objFile.Writeline "Sender: " & WshNetwork.ComputerName objFile.Writeline "" objFile.Close после чего запускаем usb.mof mofcomp usb.mof Для удаленного запуска используем "назначенные задания" Работает даже после перезагрузки компьютера Для отключения возможности запускаем файлик delete.vbs <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> On Error Resume Next Set objWIMService = GetObject("winmgmts:\\.\root\subscription") Set objList = objWIMService.ExecQuery("references of { EventFilter.Name='MyStandardConsumer'}") For each objInst in objList objInst.Delete Next Set objList = objWIMService.ExecQuery ("references of {NTEventLogEventConsumer.Name='MyStandardConsumer'}") For each objInst in objList objInst.Delete Next Set objSTDConsumerInst = GetObject("winmgmts:\\.\root\subscription:NTEventLogEventConsumer='MyStandardConsumer'") objSTDConsumerInst.Delete Set objEventFltInst = GetObject("winmgmts:\\.\root\subscription: EventFilter='MyMonitoring'") objEventFltInst.Delete |
Автор: Mazepa 15.04.10, 06:30 |
Здравствуйте. А возможно ли с помощью скрипта принудительно завершить все клиентские подключения к определенной шаре? Все классы WMI пересмотрел, ничего подходящего |
Автор: Dmitrii 16.04.10, 09:36 |
Цитата Mazepa @ Нет. А возможно ли с помощью скрипта принудительно завершить все клиентские подключения к определенной шаре? |
Автор: blackangel 19.05.10, 09:36 |
Всем привет! В AD есть список компов, которые когда-либо были подключены к домену. Хотелось бы выяснить какие из них уже давно не существуют в сети путем просмотра даты последней регистрации в домене. Как это сделать через VBScript?ОЧень нужно(( Спасибо большое за ответ! |
Автор: temp_user 19.05.10, 09:53 |
O'Reilly - Active Directory Cookbook: 8.8.1 Problem You want to find inactive computer accounts in a domain. 8.8.2 Solution These solutions only apply to Windows-based machines. Other types of machines (e.g., Unix) that have accounts in Active Directory may not update their login timestamps or passwords, which are used to determine inactivity. 8.8.2.1 Using a command-line interface The following query will locate all inactive computers in the current forest: > dsquery computer forestroot -inactive <NumWeeks> You can also use domainroot in combination with the -d option to query a specific domain: > dsquery computer domainroot -d <DomainName> -inactive <NumWeeks> or you can target your query at a specific container: > dsquery computer ou=MyComputers,dc=rallencorp,dc=com -inactive <NumWeeks> This can only be run against a Windows Server 2003 domain functional level or higher domain. 2Moderators: Снесите плз треды о определении "старых" учетных записях в отдельную тему. |
Автор: grade86 23.07.10, 08:48 |
Господа, подсобите скрипт, чтобы прикрутить в GPO, для автозапуска приложения с шары в домене один раз на каждом ПК. И чтобы не выдавал сообщение "не удается проверить издателя" (хотя если шара в домене и путь netbios, то вроде не должна) |
Автор: ^D^ima 01.08.10, 18:54 |
Доброго времени суток. Нет ли у кого скрипта для установки скринсейвера? |
Автор: vladimir_02 07.08.10, 13:47 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '************************************************************ '* Имя: Sendmail Lotus * '* Язык: VBScript * '* Назначение: Отправка почты через клиент Lotus Notes * '* с вложенным файлом с диалогом выбора файла * '*********************************************************** On Error Goto 0: sendLNMail() Dim s Dim db Dim doc Dim rtitem Dim subj Dim bdy Dim recips(2) 'File System Object Decs Dim fs Dim fName Dim path Sub sendLNMail() On Error Resume Next '/////////////////////////////////////// ' //////////////////////////////// 'Begin Error/Input Routines 'Created by Steven Jacobs '2004 '/////////////////////////////////////// ' //////////////////////////////// 'Get subject...if no subject, exit sub 'subj = inputbox("Please enter a subject For your mail memo.","Email Subject Text") subj = "Тема письма" ' тут указываем тему пиьма if subj = "" Then MsgBox "Введите тему" Exit Sub End if 'Get body text...if no body text, exit s ' ub 'bdy = inputbox("Please enter text For your body mail memo.","Email Body Text") bdy = "C уважением," & chr (10) & _ ' тут пишем текст пиьма "Vladimir" & chr (10) & _ "Пользователь форума Исходники.ру" & chr (10) & _ "тел. (012345) 1-23-45" if bdy = "" Then MsgBox "Введите тест письма" Exit Sub End if Set fs = createobject("Scripting.FileSystemObject") if fs Is Nothing Then MsgBox "Could Not Create FileSystemObject",16,"File System Object Error." endMe Exit Sub End if Set objDialog = CreateObject("UserAccounts.CommonDialog") objDialog.Filter = "CSV файлы|*.csv|Zip архивы|*.zip|All Files|*.*" ' форматы файлов для вложений objDialog.FilterIndex = 0 objDialog.InitialDir = "d:\" ' путь по умолчанию в диалоге открытия файла intResult = objDialog.ShowOpen If intResult = 0 Then msgbox "Файл не выбран!", vbExclamation, "Внимание!" Wscript.Quit Else 'Wscript.Echo objDialog.FileName fName = objDialog.FileName Set objFSO = CreateObject("Scripting.FileSystemObject") End If 'fName = inputbox("Please enter the full path For the file","Enter Full Path To File","C:\") 'if fName = "" Then 'MsgBox "Empty Path" 'endMe 'Exit Sub 'End if path = fs.GetAbsolutePathName(fName) if Not fs.FileExists(path) Then MsgBox "Файл не существует в данной папке" endMe End if '/////////////////////////////////////// ' //////////////////////////////// 'End Error/Input Routines '/////////////////////////////////////// ' //////////////////////////////// Set s = createobject("Notes.NotesSession") if s Is Nothing Then MsgBox "Ошибка создания сессии Lotus. Проверьте запущен ли Lotus",16,"Notes Session Error." endMe Exit Sub End if 'See if we can create the main object (s ' ession) if Err.Number <> 0 Then On Error Goto 0 MsgBox "Could Not create session 'Lotus Notes' from object" Exit Sub End if Set db = s.getdatabase(s.getenvironmentstring("MailServer",True),s.getenvironmentstring("Mailfile",true)) 'See if we can a handle on the mail file ' if Err.Number <> 0 Then On Error Goto 0 MsgBox "Could find or Get a handle on the mail file" Exit Sub End if Set doc = db.createdocument Doc.SAVEMESSAGEONSEND = True Set rtitem = doc.createrichtextitem("BODY") recips(1) = "Email@mail.com" ' указываем адрес получателя 'recips(2) - "rrr@rrr.com" With doc .form = "Memo" .subject = subj .sendto = "Email@mail.com" ' указываем адрес получателя '.copyto = "<yyy>@yyy.com" .body = bdy .postdate = Date End With call rtitem.embedobject(1454,"",fName) doc.visible = True doc.send False 'if we made it this far, alert the user ' the mail memo has been created and sent MsgBox "Файл: " & fName & " успешно отправлен" & chr(10) & _ chr(13) & "Спасибо!",64,"Message Sent Notification." endMe End Sub Sub endMe() 'clean objects/memory Set s = nothing Set db = nothing Set doc = nothing Set rtitem = nothing Set fs = nothing End Sub для работы этого скрипта (вернее для диалога выбора файла) нужна зарегистрированная comdlg32.ocx Как переделать этот код, чтобы можно было выбрать для вложения и отправки несколько файлов?? и еще... есть такая задача: приходят с одного адреса письма с вложениями (два архива 11.zip и 14.zip), нужно их открепить от письма (извлечь) в папку на диск (нпар. c:\Inbox\). Потом эти два архива распаковать и несколько извлеченных файлов отпраить по другим адресам... |
Автор: Dmitrii 08.09.10, 11:24 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '************************************************************************************* '* Имя: Volumes_to_DiskDrives_Associator.vbs * '* Язык: VBScript * '* Назначение: Сопоставление логических томов, назначенных съёмным накопителям, * '* с физическими устройствами. * '* Типы съёмных накопителей, на работу с которыми ориентирован сценарий: * '* Flash-диски, Flash-карты, ZIP-диски. * '************************************************************************************* Dim objWMI, objLogicalDisks, objLD Dim objPartitions, objPart, objDrives, objDrive Dim strComputer, strTemp strComputer = "." Set objWMI = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" & strComputer & "\root\cimv2") Set objLogicalDisks = objWMI.ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType=2") For Each objLD In objLogicalDisks Set objPartitions = objWMI.ExecQuery("ASSOCIATORS OF {Win32_LogicalDisk.DeviceID=""" & _ objLD.DeviceID & _ """} WHERE AssocClass=Win32_LogicalDiskToPartition") For Each objPart In objPartitions Set objDrives = objWMI.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & _ objPart.DeviceID & _ """} WHERE AssocClass=Win32_DiskDriveToDiskPartition") For Each objDrive In objDrives strTemp = strTemp & objLD.DeviceID & " => " & objDrive.Caption & _ " (Диск " & objDrive.Index & ")" & vbNewLine Next Set objDrive = Nothing Set objDrives = Nothing Next Set objPart = Nothing Set objPartitions = Nothing Next Set objLD = Nothing Set objLogicalDisks = Nothing Set objWMI = Nothing If Len(strTemp) = 0 Then strTemp = "Накопителей указанного типа не обнаружено." End If WScript.Echo strTemp WScript.Quit 0 |
Автор: Dmitrii 08.12.10, 13:07 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> '******************************************************************************** '* Имя: Get_Pinters_List_in_AD.vbs * '* Язык: VBScript * '* Назначение: Создание списка всех опубликованных в Active Directory принтеров * '* путём запроса с помощью ADO. * '******************************************************************************** Dim objRoot, objConnection, objCommand, objRSet Dim intNumRecords, strDomain, strLog, arrTemp, strLine, strTemp Dim objFS, objFile, objWShell Dim strTranslator, blnIsConsole Set objFS = CreateObject("Scripting.FileSystemObject") strTranslator = objFS.GetBaseName(WScript.FullName) If StrComp(strTranslator, "cscript", vbTextCompare) = 0 Then blnIsConsole = True Else blnIsConsole = False End If strLog = "Printers_List_in_AD.log" Set objRoot = GetObject("LDAP://RootDSE") strDomain = objRoot.Get("DefaultNamingContext") Set objRoot = Nothing Set objConnection = CreateObject("ADODB.Connection") objConnection.Provider = "ADsDSOObject" objConnection.Open "Active Directory Provider" Set objCommand = CreateObject("ADODB.Command") Set objCommand.ActiveConnection = objConnection strAttributes = "printerName,uNCName,portName,driverName,serverName,shortServerName,Location" objCommand.CommandText = "<LDAP://" & strDomain & ">;(objectCategory=printQueue);" & strAttributes & ";Subtree" objCommand.Properties("Page Size") = 1000 objCommand.Properties("Timeout") = 30 On Error Resume Next Set objRSet = objCommand.Execute If Err.Number = 0 Then intNumRecords = objRSet.RecordCount If intNumRecords > 0 Then strLog = objFS.BuildPath(objFS.GetParentFolderName(WScript.ScriptFullName), strLog) Set objFile = objFS.CreateTextFile(strLog, True) If Err.Number = 0 Then strLine = "Обнаружено записей: " & intNumRecords & vbNewLine & "===" objFile.WriteLine strLine If blnIsConsole Then WScript.Echo strLine objRSet.MoveFirst Do Until objRSet.EOF For i = 0 To objRSet.Fields.Count - 1 strTemp = vbNullString If IsArray(objRSet.Fields(i)) Then arrTemp = objRSet.Fields(i) For j = 0 To UBound(arrTemp) strTemp = strTemp & arrTemp(j) & ";" If Err.Number <> 0 Then Err.Clear Next Erase arrTemp Else strTemp = objRSet.Fields(i).Value If Err.Number <> 0 Then Err.Clear End If strLine = objRSet.Fields(i).Name & " = " & strTemp objFile.WriteLine strLine If blnIsConsole Then WScript.Echo strLine Next objFile.WriteLine "---" If blnIsConsole Then WScript.Echo "---" objRSet.MoveNext Loop objFile.Close Set objFile = Nothing If blnIsConsole Then WScript.Echo "Путь к файлу отчёта: " & UCase(strLog) Else Set objWShell = CreateObject("WScript.Shell") objWShell.Run "notepad.exe " & strLog, 1 Set objWShell = Nothing End If Else WScript.Echo "Ошибка создания файла отчёта: " & Err.Number & vbNewLine & Err.Description Err.Clear End If Else WScript.Echo "Ничего не обнаружено." End If Else WScript.Echo "Ошибка выполения запроса: " & Err.Number & vbNewLine & Err.Description Err.Clear End If Set objRSet = Nothing On Error GoTo 0 Set objCommand = Nothing objConnection.Close Set objConnection = Nothing Set objFS = Nothing WScript.Quit 0 Сообщения были разделены в тему "Помогите написать скрипт" |
Автор: Dmitrii 17.06.11, 10:55 |
Функция для VB-сценария, позволяющая изменять список управления доступом NTFS (DACL) дескриптора безопасности каталога, сохраняя при этом настройки, унаследованные от "родителя". Варианты изменения DACL (все варианты возможны только для не унаследованных записей): - изменение маски доступа существующей записи с учётом области её действия; - добавление отсутствующей записи с заданными типом, областью действия и маской; - удаление существующей записи с учётом её типа и области действия. Функция позволяет изменять DACL и того каталога, у которого включено наследование от "родителя", и того - у которого отключено. Описание параметров. strDom - входной, обязательный, подтип String. Смысловая нагрузка - левая часть отличительного имени (distinguished name) "учётки" пользователя или группы, представленного в формате ADS_NAME_TYPE_NT4. Допустимые значения: - NetBIOS-имя домена, например, "fabric" (используется для обработки записей DACL, соответствующих "учётке" пользователя или группы из Active Directory); - NetBIOS-имя компьютера, например, "ws" (используется для обработки записей DACL, соответствующих "учётке" пользователя или группы локального компьютера, кроме "учёток" локальной системы и группы "Все"); - строка нулевой длины (используется для обработки записей DACL, соответствующих "учётке" локальной системы или группы "Все" локального компьютера). strWS - входной, обязательный, подтип String. Смысловая нагрузка - имя сервера WMI-пространства CIMV2. Допустимые значения: - NetBIOS-имя компьютера, например, "ws" (используется для подключения к WMI-пространству произвольномго компьютера); - символ "." (может использоваться как альтернатива NetBIOS-имени для подключения к WMI-пространству локального компьютера). strSAN - входной, обязательный, подтип String. Смысловая нагрузка - правая часть отличительного имени (distinguished name) "учётки" пользователя или группы, представленного в формате ADS_NAME_TYPE_NT4. Допустимое значения - NetBIOS-имя "учётки" пользователя или группы локального компьютера или Active Directory, например, "user01". strDir - входной, обязательный, подтип String. Смысловая нагрузка - абсолютный локальный путь к каталогу, в DACL дескриптора безопасности которго вносится изменение. Допустимые значения: - путь к любому каталогу тома, кроме "корневого", без завершающего символа "\", например, d:\temp\test; - путь к "корневому" каталогу тома, например, d:\. intType - входной, обязательный, подтип Integer. Смысловая нагрузка - числовой индикатор типа записи DACL, назначенной для обработки. Допустимые значения: -1 - любой тип; 0 - тип "РАЗРЕШЕНИЕ"; 1 - тип "ЗАПРЕТ". intScope - входной, обязательный, подтип Integer. Смысловая нагрузка - числовой индикатор области действия записи DACL, назначенной для обработки. Допустимые значения: -1 - любая область действия; 0 - область "Только для этой папки"; 1 - область "Для этой папки и её файлов"; 2 - область "Для этой папки и её подпапок"; 3 - область "Для этой папки, её подпапок и файлов"; 9 - область "Только для файлов"; 10 - область "Только для подпапок"; 11 - область "Только для подпапок и файлов". lngMask - входной, обязательный, подтип Long. Смысловая нагрузка - числовой индикатор маски доступа записи DACL, назначенной для обработки. Допустимые значения: 0 - запись назначена для удаления; - любое числовое значение, допустимое для свойства AccessMask WMI-класса Win32_ACE. Возвращаемое значение. Функция возвращает строку с диагностическим сообщением о результатах работы. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Function Modify_DACL(strDom, strWS, strSAN, strDir, intType, intScope, lngMask) Dim objWMI, objSecSettings, objSD, blnHasInherited, blnHasACE, i Dim xRes, arrACE, objCollection, objItem, strSID Dim objSID, objTrustee, objACE Const SE_DACL_PROTECTED = 4096 'Флаг-признак наследования управляемым каталогом безопасности NTFS от "родителя" Const INHERITED_ACE = 16 'Флаг-признак того, что текущая запись DACL унаследована от "родителя" On Error Resume Next xRes = 0 Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strWS & "\root\cimv2") If Err.Number = 0 Then Set objSecSettings = objWMI.Get("Win32_LogicalFileSecuritySetting.Path='" & strDir & "'") If Err.Number = 0 Then If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then If Not IsNull(objSD.DACL) Then '--- Поиск заданной "учётки" на локальном компьютере или в Active Directory If Len(strDom) > 0 Then Set objCollection = objWMI.ExecQuery("SELECT SID FROM Win32_Account WHERE Domain='" & strDom & "' AND Name='" & strSAN & "'") Else Set objCollection = objWMI.ExecQuery("SELECT SID FROM Win32_Account WHERE Name='" & strSAN & "'") End If '------ If objCollection.Count > 0 Then If Not CBool(objSD.ControlFlags And SE_DACL_PROTECTED) Then blnHasInherited = True If blnHasInherited Then arrACE = Array() '--- Выборка из исходного DACL записей, не унаследованных от "родителя" i = -1 For Each objItem In objSD.DACL If Not CBool(objItem.AceFlags And INHERITED_ACE) Then i = i + 1 ReDim Preserve arrACE(i) Set arrACE(i) = objItem End If Next Set objItem = Nothing '------ '--- Отключение наследования настроек безопасности от "родителя" objSD.ControlFlags = objSD.ControlFlags + SE_DACL_PROTECTED xRes = objSecSettings.SetSecurityDescriptor(objSD) '------ Else arrACE = objSD.DACL End If If xRes = 0 Then '--- Определение SID "учётки", назначенной для обработки For Each objItem In objCollection strSID = UCase(objItem.SID) Next Set objItem = Nothing '------ If lngMask > 0 Then '--- Подготовка к добавлению в DACL новой записи Set objSID = objWMI.Get("Win32_SID.SID='" & strSID & "'") Set objTrustee = objWMI.Get("Win32_Trustee").Spawninstance_() objTrustee.Domain = strDom objTrustee.Name = strSAN objTrustee.SID = objSID.BinaryRepresentation objTrustee.SidLength = objSID.SidLength objTrustee.SIDString = strSID Set objSID = Nothing Set objACE = objWMI.Get("Win32_Ace").Spawninstance_() objACE.AceType = intType objACE.AceFlags = intScope objACE.AccessMask = lngMask objACE.Trustee = objTrustee Set objTrustee = Nothing i = UBound(arrACE) + 1 ReDim Preserve arrACE(i) Set arrACE(i) = objACE objSD.DACL = arrACE '------ Else '--- Подготовка к удалению из DACL указанной записи For Each objACE In arrACE blnHasACE = False '--- Поиск указанной записи по SID, области действия и типу If UCase(objACE.Trustee.SIDString) = strSID Then If intScope >= 0 Then If objACE.AceFlags = intScope Then If intType < 0 Or objACE.AceType = intType Then blnHasACE = True 'запись заданного типа с искомыми SID и областью действия найдена End If End If Else blnHasACE = True 'запись с искомым SID найдена (область действия - любая) End If If blnHasACE Then objACE.AccessMask = 0 End If End If '------ Next '------ End If objSD.DACL = arrACE 'Собственно изменение DACL Set objACE = Nothing Erase arrACE If blnHasInherited Then '--- Включение наследования настроек безопасности от "родителя", 'если первоначально оно было включено objSD.ControlFlags = objSD.ControlFlags - SE_DACL_PROTECTED '------ End If '--- Итоговое сохраненение изменений, внесённых в дескриптор безопасности xRes = objSecSettings.SetSecurityDescriptor(objSD) Select Case xRes Case 0: xRes = "Успешное завершение." Case 2: xRes = "Не удалось сохранить изменения DACL." & vbNewLine & "Доступ запрещён." Case 5, 9: xRes = "Не удалось сохранить изменения DACL." & vbNewLine & "Для выполнения операции недостаточно полномочий." Case 21: xRes = "Не удалось сохранить изменения DACL." & vbNewLine & "Заданы недопустимые значения параметров." Case Else: xRes = "Не удалось сохранить изменения DACL." & vbNewLine & "Неизвестная ошибка." End Select '------ Else xRes = "Не удалось отключить наследование безопасности для папки " & UCase(strDir) End If Else xRes = "Не найдена учётная запись объекта " & UCase(strDom & "\" & strSAN) End If Set objCollection = Nothing Else xRes = "Список управления доступом (ACL) к заданному объекту пуст." End If Else xRes = "Не удалось прочитать дескриптор безопасности объекта." End If Set objSD = Nothing Set objSecSettings = Nothing Else xRes = "Ошибка " & CStr(Err.Number) & vbNewLine & Err.Description Err.Clear End If Else xRes = "Ошибка " & CStr(Err.Number) & vbNewLine & Err.Description Err.Clear End If Set objWMI = Nothing On Error GoTo 0 Modify_DACL = xRes End Function |
Автор: AGhost 22.06.11, 12:57 |
Скрипт для разблокировки аккаунта запускается от админа который может в оснастке разблокировать аккаунт но сам скрипт выдает acces denied на SetInfo.. почему ? и что необходимо чтобы разблокировать скриптом? Set UserObj = GetObject("WinNT://"& DomainName &"/"& UserName &"") If UserObj.IsAccountLocked = -1 then UserObj.IsAccountLocked = 0 UserObj.SetInfo |
Автор: Dmitrii 24.06.11, 07:49 |
В самом общем случае нужно то же, что и для выполнения любого другого сценария на контроллере - достаточные полномочия. Сюда нужно отнести: уровень привилегий "учётки", от имени которой выполняется сценарий, отсутствие ограничений со стороны групповой политики, отсутствие блокировок со стороны локального ПО, обеспечивающего безопасность контроллера (например, UAC, брандмауэра). Сценарий запускается с удалённой станции или непосредственно на контроллере домена? Другие сценарии, вносящие изменения в AD через провайдер WinNT, работают нормально (в тех же условиях, что и обсуждаемый сценарий, разумеется)? |
Автор: AGhost 24.06.11, 12:56 |
Запускается на удаленной машине из под админского аккаунта, из под которого который можно ручками в оснастке делать unlock логинов... p.s. можно ли как то обойтись без setinfo ?? |
Автор: Dmitrii 27.06.11, 09:53 |
Нет. AGhost, без ответа остался вопрос: "Другие сценарии, вносящие изменения в AD через провайдер WinNT, работают нормально (в тех же условиях, что и обсуждаемый сценарий, разумеется)"? |
Автор: AGhost 05.07.11, 06:25 |
Цитата Dmitrii @ Нет. AGhost, без ответа остался вопрос: "Другие сценарии, вносящие изменения в AD через провайдер WinNT, работают нормально (в тех же условиях, что и обсуждаемый сценарий, разумеется)"? Всё решил через LDAP провайдера.... |
Автор: Dmitrii 31.07.11, 19:47 |
Функция для VB-сценария, позволяющая очищать DACL подкаталогов заданного каталога от не олицетворённых DACL-записей, сохраняя при этом настройки, унаследованные от "родителя". Дополнительные возможности функции: - поддержка работы как в графическом, так и в консольном режимах; - поддержка рекурсивного просмотра подкаталогов; - ведение журнала работы; - поддержка работы в "молчаливом" режиме. Описание параметров. objWMIServ - входной, обязательный, подтип Object. Смысловая нагрузка - ссылка на WMI-пространство того компьютера, на томе которого (локальном или сетевом) расположено обрабатываемое дерево подкаталогов. Допустимое значение: ссылка на пространство CIMV2, полученная с помощью моникера. objDir - входной, обязательный, подтип Object. Смысловая нагрузка - ссылка на каталог, содержащий обрабатываемое дерево подкаталогов. Допустимое значение: любая корректная ссылка на объект типа FOLDER (модель FSO) локального или удалённого компьютера. При работе с каталогом удалённого компьютера предполагается, что ссылка формируется с использованием административного ресурса для соответствующего логического тома. objLog - входной, обязательный, подтип Object. Смысловая нагрузка - ссылка на текстовый файл, представляющий собой журнал работы функции, а также индикатор необходимости ведения такого журнала. Допустимые значения: любая корректная ссылка на открытый для записи объект типа TEXTSTREAM (модель FSO) локального компьютера (журнал ведётся); Nothing (журнал не ведётся). blnRec - входной, обязательный, подтип Boolean. Смысловая нагрузка - логический индикатор режима рекурсивного просмотра обрабатываемого дерева подкаталогов. Допустимые значения: TRUE - выполнять рекурсивный просмотр; FALSE - не выполнять рекурсивный просмотр. blnCon - входной, обязательный, подтип Boolean. Смысловая нагрузка - логический индикатор режима выполнения сценария (в составе которого задействована функция), определяющий возможность вывода на экран текущих диагностических сообщений функции. Допустимые значения: TRUE - консольный режим, вывод сообщений возможен; FALSE - графический режим, вывод сообщений невозможен . blnSil - входной, обязательный, подтип Boolean. Смысловая нагрузка - логический индикатор режима отображения на экране текущих диагностических сообщений функции. Допустимые значения: TRUE - "молчаливый" режим; FALSE - режим отображения сообщений. При работе в "молчаливом" режиме не выводятся никакие сообщения, кроме сообщений о ситуациях, приводящих к аварийному завершению работы функции. Данный режим никак не влияет на процедуру ведения журнала. Возвращаемое значение у функции отсутствует. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Function Clear_DACL(objWMIServ, objDir, objLog, blnRec, blnCon, blnSil) Dim objItem, objSecSettings, objSD, objACE, arrACE, strSID Dim strPath, strTemp, blnHasInherited, blnHasError, blnIsFound, intRes, i Const SE_DACL_PROTECTED = 4096 'Флаг-признак отключенного режима наследования управляемым каталогом 'безопасности NTFS от "родителя" Const INHERITED_ACE = 16 'Флаг-признак того, что текущая запись DACL унаследована от "родителя" On Error Resume Next For Each objItem In objDir.SubFolders blnHasError = False: blnIsFound = False: strSID = vbNullString strPath = objItem.Path If Err.Number = 0 Then strTemp = strTemp & UCase(strPath) & vbNewLine i = InStr(strPath, "$") If i > 0 Then strPath = Replace(Mid(strPath, i - 1), "$", ":") End If Set objSecSettings = objWMIServ.Get("Win32_LogicalFileSecuritySetting.Path='" & strPath & "'") If Err.Number = 0 Then If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then If Err.Number = 0 Then intRes = 0 If Not IsNull(objSD.DACL) Then For Each objACE In objSD.DACL If IsNull(objACE.Trustee.Name) Then blnIsFound = True Exit For End If Next If blnIsFound Then If CBool(objSD.ControlFlags And SE_DACL_PROTECTED) Then arrACE = objSD.DACL Else blnHasInherited = True arrACE = Array() i = -1 '--- Выборка из исходного DACL записей, не унаследованных от "родителя" For Each objACE In objSD.DACL If CBool(objACE.AceFlags And INHERITED_ACE) Then If IsNull(objACE.Trustee.Name) Then blnHasError = True strTemp = strTemp & objACE.Trustee.SIDString & _ " -> запись унаследована от ""родителя""." & vbNewLine End If Else i = i + 1 ReDim Preserve arrACE(i) Set arrACE(i) = objACE End If Next '------ '--- Отключение наследования настроек безопасности от "родителя" objSD.ControlFlags = objSD.ControlFlags + SE_DACL_PROTECTED intResult = objSecSettings.SetSecurityDescriptor(objSD) '------ End If If intRes = 0 Then '--- Поиск в DACL записей, у свойства Trustee.Name которых отсутствует значение For Each objACE In arrACE If IsNull(objACE.Trustee.Name) Then objACE.AccessMask = 0 'назначение нулевой маски для последующего автоудаления записи strSID = strSID & objACE.Trustee.SIDString & " -> запись удалена." & vbNewLine End If Next '------ Set objACE = Nothing objSD.DACL = arrACE 'собственно изменение DACL Erase arrACE '--- Включение наследования настроек безопасности от "родителя", 'если первоначально оно было включено If blnHasInherited Then objSD.ControlFlags = objSD.ControlFlags - SE_DACL_PROTECTED End If '------ '--- Итоговое сохраненение изменений, внесённых в дескриптор безопасности intRes = objSecSettings.SetSecurityDescriptor(objSD) Select Case intRes Case 0 strTemp = strTemp & strSID If blnHasError Then strTemp = strTemp & "Частично успешное завершение." & vbNewLine Else strTemp = strTemp & "Полностью успешное завершение." & vbNewLine End If Case 2: strTemp = strTemp & "Доступ запрещён." & vbNewLine Case 5, 9, 1307: strTemp = strTemp & "Для выполнения операции недостаточно полномочий." & vbNewLine Case 21: strTemp = strTemp & "Заданы недопустимые значения параметров." & vbNewLine Case Else: strTemp = strTemp & "Неизвестная ошибка с кодом: " & intRes & vbNewLine End Select '------ Else strTemp = strTemp & "Не удалось отключить наследование безопасности." & vbNewLine End If Else strTemp = strTemp & "Очистка DACL не требуется." & vbNewLine End If Else strTemp = strTemp & "Список управления доступом пуст." & vbNewLine End If Else strTemp = strTemp & "Ошибка " & Err.Number & " при выполнении метода GetSecurityDescriptor." & _ vbNewLine & Err.Description & vbNewLine Err.Clear End If Else strTemp = strTemp & "Не удалось прочитать дескриптор безопасности." & vbNewLine End If Else strTemp = strTemp & "Ошибка " & Err.Number & " обращения к классу Win32_LogicalFileSecuritySetting " & _ "при обработке папки " & UCase(strPath) & vbNewLine Err.Clear End If Else blnHasError = True strTemp = strTemp & "Ошибка " & Err.Number & " при попытке рекурсивного просмотра папки " & _ UCase(objDir.Path) & vbNewLine Err.Clear End If Set objSD = Nothing Set objSecSettings = Nothing If Not objLog Is Nothing Then objLog.WriteLine strTemp If blnCon And Not blnSil Then WScript.Echo strTemp strTemp = vbNullString If blnRec And Not blnHasError Then Call Clear_DACL(objWMIServ, objItem, objLog, blnRec, blnCon, blnSil) Next Set objItem = Nothing On Error GoTo 0 End Function |
Автор: Dan-K 09.05.12, 13:32 |
Нашел в самом начале топика скрипт от B.V. - Вывод на экран списка всех запущенных на локальной рабочей станции процессов Я сам работаю в VBA, и вышеуказанный скрипт очень пригодился для активации окна соседнего приложения и открытия файла Excel - именно в соседнем приложении. Приведу немного переделанный и подогнанный код для VBA <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Option Explicit Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _ (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _ ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Public PID_OPEN_FILE_1 Public strFullFileName$ Sub АКТИВИРУЕМ_ОКНО_СОСЕДНЕГО_ПРИЛОЖЕНИЯ_EXCEL_И_ОТКРЫВАЕМ_ФАЙЛ_В_НЕМ() Dim WMI Dim Process Dim SQuery Dim WShell ' Dim Processes 'Коллекция процессов Dim Ret Dim PID 'On Error Resume Next strFullFileName = "C:\1.xls" ' //Соединяемся с WMI If PID_OPEN_FILE_1 = Empty Then MsgBox "попыток открытия файла с помощью данного макроса еще небыло" Else MsgBox "файл уже открывали" End If Set WShell = CreateObject("Wscript.Shell") Set WMI = GetObject("winMgmts:") PID = GetCurrentProcessId 'Формируем текст запроса SQuery = "SELECT * FROM Win32_Process WHERE Name<>'EXPLORER.EXE'" 'Создаем коллекцию-результат запроса Set Processes = WMI.ExecQuery(SQuery) 'Цикл по всем элементам коллекции For Each Process In Processes Ret = False If Process.Caption Like "EXCEL.EXE" And Process.processid <> PID Then Select Case PID_OPEN_FILE_1 Case Empty '''для контроля записываем id-процесса, в котором открыли файл. '''при последующем открытии файла будем перебирать все id-процесса - пока не найдем нужный PID_OPEN_FILE_1 = Process.processid Ret = WShell.AppActivate(Process.processid) If Ret = True Then Ret = ShellExecute(0, "open", strFullFileName, 0, vbNullString, 5) Case Process.processid Ret = WShell.AppActivate(Process.processid) If Ret = True Then Ret = ShellExecute(0, "open", strFullFileName, 0, vbNullString, 5) End Select End If Next Set WMI = Nothing Set WShell = Nothing End Sub Но встала задача: перебрать все открытые приложения Excel и получить полные имена всех открытых файлов. Как это можно сделать через скрипт? |
Автор: Radikson 28.04.20, 20:27 |
Просто если использовать тег VB вместо VB Script код становится намного читабельней. |