Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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
Цитата Rust @
Просто если использовать тег VB вместо VB Script код становится намного читабельней.
Пожалуй, так. Впрочем, лично для меня большой разницы нет.
<{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
:yes:

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
Цитата Koss @
собственно, а как задавать версию файла этой же функцией ?

Оффициально - никак.

Версия файла задается в ресурсах файла, и подключается к ехе-шнику во время компиляции(точнее линковки), а поменять можно (нелегально :) ) открыв файл и пройдясь по нему в поисках юникодовой строки 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
Не хочу чтоб автоматом чистилось.. Хочу чтоб сам 8-)

Автор: 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
Цитата Juretђ @
А если просто монтировать раздел?
Мне хотелось бы именно скрывать, это нужно что бы на другом компе диск не монтировался автоматически.

Автор: X11 19.04.07, 09:11
Dmitrii, супер, весьма благодарен 8-)

Автор: Pit-Bul 19.04.07, 12:24
Цитата Dmitrii @
Pit-Bul, если Вы захотите наблюдать за ходом копирования с помощью стандартного "прогресс"-индикатора, то обратите внимание на сценарий CopyFolder_with_Progress.vbs, который опубликован в сообщении #14.


я туда смотрел, но так и не понял как связать PARAM_DIALOG с копированием файлов :D

Автор: Dmitrii 20.04.07, 04:56
Цитата Pit-Bul @
... но так и не понял как связать PARAM_DIALOG с копированием файлов
Константа 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
Цитата mr.Neo @
скриптика который прописывает рабочую группу на локальном компе?
"Прописывает" - это значит создаёт новую?
Если так, то вот пример:
<{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
Цитата mr.Neo @
скорее всего заменяет ту которая есть....
Это как?
Цитата mr.Neo @
strDomainName = "Domain_name" - это можно удалить?
Можно.
Цитата mr.Neo @
Set objComputer = GetObject("WinNT://" & strCompName) - а это будет так?
Так.

Автор: 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
Цитата AlexLine @
А ДФС и система репликаций - не судьба? или просто не те масштабы?

Масштабы то наверное и те, но увы, изобразить у меня этого не получается, точнее получилось но немного не то, не одуплюсь как автопереименовывание файлов делать. Блин, обидно: потребности то растут, а удовлетворить то их не получается.

Добавлено
Народы, а никто не знает как изваять скрипт, который бы открывал общий доступ к папке. (Нужно для сетки).

Автор: 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-ов. :wall: Может кто-то спасти Если у кого-то есть какие-то ссылки, буду очень рад :)

Автор: AlexJ 07.08.07, 05:40
Цитата DataKill @
Уже долго роюсь в нете в поисках какой-то инфы по поводу написанию VBScript-ов.

Полезные скрипты (сообщение #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
Цитата Dmitrii @
Мне нужно например дату сравнить с другой датой и выяснить разницу количество дней

можно так (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
Цитата DFG @
мне нужно на всех компах (240 штук) изменить маску с 255,255,255,0 на 255,255,252,0

А разве это
Полезные скрипты (сообщение #1484865)
не то ?

Автор: Dmitrii 05.10.07, 11:20
Цитата Mbus @
Подскажите, можно ли вытащить имеющийся параоль?
Легальными средствами нельзя.

Цитата Mbus @
В консоли ActiveDirectory все пользователи размещаются не просто в домене а в подпапке (подразделе) Users, как там создавать пользователя?
Для начала посмотрите уже имеющиеся в этой теме примеры: Полезные скрипты, сообщение #5, а затем вот этот пример:
<{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

Цитата sbonus @
Как поставить галочку нельзя менять пароль в свойствах пользователя?
Речь идёт о свойстве пользовательской "учётки" Запретить смену пароля пользователем?

Цитата 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
Цитата zerghack007 @
Пароль можно светить.

О каком пароле речь? Если о пароле пользователя test, то никак. Если о пароле админа, то два варианта:
1. Залогиниться под админом и выполнить скрипт.
2. Создать ярлык с путем %windir%\system32\wscript.EXE "C:\Documents and Settings\<username>\Рабочий стол\script.vbs" и дальше Run as...

Автор: zerghack007 19.11.07, 09:33
Цитата Domino @
О каком пароле речь?

Речь идет о пароле админа.

Цитата
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.

Цитата Domino @
Если о пароле пользователя test, то никак
Если речь о том, что нельзя задать пароль пользователя при создании его "учётки" с помощью сенария, то это НЕВЕРНО. За решение этой задачи отвечает метод 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
Цитата zerghack007 @
Нашел выход из ситуации и пароль светить не надо.
Или я чего-то не понимаю в условиях Вашей задачи, или Вы ошибаетесь, делая указанный выше вывод.

По поводу сценария, помещённого в Вашем сообщении #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
Цитата blackangel @
... как написать vbs-скрипт удаления сервиса...

Насколько мне известно, удалить службу нельзя, можно лишь её остановить и запретить запуск.
Пример подобного управления службой:
<{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 @
... Пишет ошибку: User credentials cannot be used for local conections
Вы пробовали запускать сценарий на том компьютере, на котором работаете сами, или на удалённом? У меня, например, этот сценарий работает только при указании удалённой станции.
Цитата 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 8-)

Автор: LAW 08.01.08, 12:39
Приветствую уважаемый Пипл!!!
Отличная тема!!! Многие скрипты оказались очень полезными.
У меня тут проблемка возникла... Начальство решило что имя домена, которое видно при входе в Виндовс его не устраивает и решило его поменять. Ренейм домена не проходит из-за наличия на PDC Ексченьжа. Переустанавливать всё - это последнее дело.
Вот и возник интересный вопрос. Скриптом можно много чего реализовать... А нельзя ли им на логон скрине подменить название домена, что бы юзверь видел одно имя, а входил в нормальный.
Вот сижу, копаю по этой теме, но пока :wall:
Спасибо.

Автор: 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
Цитата LAW @
Вот сижу, копаю по этой теме, но пока :wall:

Смотри в сторону темы 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
Цитата blackangel @
... Как получить список всех машин в сети...
Один из вариантов (с использованием 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

Цитата blackangel @
... как проверить какие доступны на данный момент?
Более надёжного и универсального средства, чем простое "пингование" я пока не нашёл. Может кто-нибудь другой подскажет.
А вариант реализации в сценарии может быть таким (вариант для консоли):
<{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 @
Подскажите такой VBS скрипт--запускается с флэшки...
Автоматически запускается?

Цитата Лёха @
Скрипт с флешки не запустится. Это будет считатся вирусом.
При каких условиях? Какое ПО будет считать его вирусом?

Автор: 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 адрес имя активной учетной записи под которой залогинен пользователь и все это вывести в текстовый файл приверно в таком виде:

LoginNameHostNameIP_address
pupkincomp_001192.168.0.1
ivanovcomp_002192.168.0.2

Автор: 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


Добавлено
Цитата avsen @
Подмогните скриптом
надо прописать пользователям домена
альтнрнативный DNS
доп. шлюз
Вгляните для начала на сообщения #3 и #11 в данной теме.

Автор: avsen 05.02.08, 09:57
Цитата Dmitrii @
Вгляните для начала на сообщения #3 и #11 в данной теме.


Извините, но мне надо альтернативный DNS, т.е. должно быть основной и альтернативный
у меня нет DHCP - все ip статические

Автор: Dmitrii 11.02.08, 07:19
Цитата avsen @
... мне надо альтернативный DNS, т.е. должно быть основной и альтернативный...
Сценарий 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
да, я все так и делаю
но про загрузке вот такая ошибка вываливается
user posted image

там где line, стоит цифра 3

Автор: ANdrewZ 13.02.08, 10:56
все, понял где была моя ошибка, я все таки не туда скрипт цеплял. Спасибо за помощь!

Автор: Dmitrii 18.02.08, 13:53
Цитата Petrov @
Помогите скриптиком раздающим права доступа к расшаренной папке.
Если ещё актуально, то укажите тип сети (доменная или одноранговая).

Автор: 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.

Добавлено
Цитата tim01 @
... со скриптом который бы отключал учётную запись...
Смотрите сообщение #5 данной темы.

Цитата tim01 @
... удалял её с AD...
Один из вариантов:
<{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" НЕ ПОЛУЧИТ доступ к папке из сети.
з.ы.
Скрипт не работет. Ошибки валятся.
:huh:

Автор: Dmitrii 21.02.08, 05:04
Цитата Petrov @
Настройка безопастности NFS и настройка сетевого доступа в расшаренный ресурс не одно и тоже...
Во-первых, я и не утверждал, что это ОДНО И ТО ЖЕ. Было сказано: "... мало чем отличается".
Во-вторых, речь шла не о функциональности этих средств администрирования, а о процедуре настройки дескриптора безопасности.
Наконец, Вы всерьёз полагаете, что берясь на написание сценариев для системного администрирования, я не имею представления о том, чем собираюсь управлять? :)

Цитата Petrov @
Скрипт не работет. Ошибки валятся.
Какие именно?
"Пробежаться" по сценарию отладчиком пробовали? Если пробовали, то где именно возникает первая ошибка.

Автор: Petrov 21.02.08, 05:10
Дайте ссылочку где отадчик забрать.
Плизз.

Автор: Dmitrii 21.02.08, 06:10
Цитата Petrov @
Дайте ссылочку где отадчик забрать.
Если у Вас есть 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
Цитата Petrov @
Вот тут останавливается
If objCollection.Count > 0 Then
Такое выражение в сценарии встречается дважды. О котором речь?
Если изменяли код сценария, то выложите, пожалуйста, свой вариант.

Добавлено
Цитата tim01 @
Ой простите, мне что бы удалялись учётки которые отключены уже два месяца в AD и удалялся профиль с документ сетингс вместе с аккаунтом
Особого свойства, хранящего дату отключения "учётки", вроде бы нет. Однако, если с момента отключения никакие свойства отключенной "учётки" не изменялись, то можно воспользоваться свойством WhenChanged. Реализовать это можно как-нибудь так:
<{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
Туплю..ууу- не могу! На удаленном компе есть расшарен.папка А,в ней обычная папка В .Как снять наследование у папки В от папки А скриптом? Заранее признателен!(Третий день уже сижу...) :wall:

Это сообщение было перенесено сюда или объединено из темы "Как отключить наследование у вложенной папки на удаленном 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
Цитата Dmitrii @
Ваша задача сформулирована слишком лаконично.

Имеется список 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 @
Какие службы на удаленном компьютере должны быть запущены чтобы функция 'GetObject("winmgmts:".......' работала?
Служба "Инструментарий управления Windows".
Однако причиной такой ошибки может быть ещё и некорректная работа 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
Цитата se_ma @
Подскажите, как задать сетевому адаптеру 2-а IP адреса?

Воспользоваться поиском или хотя бы дочитать первую страницу этой темы ;) , где в 3-м посте есть решение.

Автор: Ixtiander 31.05.08, 06:09
А как скриптом просканировать все вложенные папки и вытащить у них информацию "security"?

Автор: Dmitrii 02.06.08, 03:51
Цитата Ixtiander @
и вытащить у них информацию "security"?
Посмотрите сообщение #21, сценарий Check_File_SecuritySetting, этой темы.

Цитата Ixtiander @
просканировать все вложенные папки
Используйте рекурсию.

Автор: Ixtiander 02.06.08, 05:22
Цитата Dmitrii @
Цитата Ixtiander @
и вытащить у них информацию "security"?
Посмотрите сообщение #21, сценарий Check_File_SecuritySetting, этой темы.

Не работает под Win 2003 server :(

Автор: Dmitrii 02.06.08, 08:33
Цитата Ixtiander @
Не работает под Win 2003 server
Этот сценарий использовался под 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
Цитата Ixtiander @
line 36
char 1
error not found
code 80041002
source SwbemServicesEx
Причина - на диске С: отсутствует папка 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
Цитата Romtek @
kuhnsn, в какой умной книжке ты читал про этот скрипт...
Пример аналогичного по сути сценария можно найти в TechNet Script Center (см. ссылку в сообщении #38 этой темы).

Цитата Romtek @
... Просто попробовал попользоваться им, но вылетает ошибка "Не доступен сервер RPC" в строке...
Наиболее вероятны две причины:
- неверно указаны имя и (или) пароль локального администратора присоединяемого к домену узла;
- локальному администратору, учётные данные которого указаны в сценарии (или всей группе локальных администраторов), запрещено обращение к пространству имён CIMV2.

Цитата Pit-Bul @
... непонятен параметр "root\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
Цитата Romtek @
Я такого не писал. Цитировать надо было Pit-Bul!
"Проморгал", приношу свои извинения.

Цитата Romtek @
Воспользовавшись приведённым материалом, не нашёл среди скриптов ничего похожего.
Искали по ключу JoinDomainOrWorkGroup?
Например, в справочнике "The Portable Script Center, Version 3.0, November 2004" сценарий присоединения узла к домену находится в разделе Active Directory - Computer Accounts и называется Join a Computer to a Domain.

Цитата Romtek @
У меня возникла идея написать скрипт, который будет выполняться во время login на сервере...
А подробнее.

Цитата Pit-Bul @
не понятно где эти разрешения давать, на локальной машине или контроллере домена.
На том компьютере, к 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.

Это не то.
Цитата Dmitrii @
А подробнее.

Сетевой вход в систему (Net Logon). При этом у всех пользователей запускается заданный скрипт. Правда, мне нужно, чтобы скрипт выполнялся только для Workstation Member домена.
Кое-что уже накопал, буду пробовать понемногу.

Добавлено
Цитата Dark-Dragon @
У меня на всех ПК в сетке разные имена локальных админов, хочется, как то это все автоматически переименовать в одно имя и поменять пароль.


Перед тем, как что-либо менять, есть несколько вопросов:
  1. Являешься ли ты уполномоченным администратором этой сети?
  2. Все ли локальные администраторы уведомлены о предстоящих изменениях паролей?
  3. Сеть одноранговая (workgroup) или домен?

Автор: Dark-Dragon 25.06.08, 05:19
Полномочия такие есть, сеть - Домен.

Автор: Dmitrii 25.06.08, 06:59
Цитата Dark-Dragon @
У меня на всех ПК в сетке разные имена локальных админов, хочется, как то это все автоматически переименовать в одно имя...
Если речь идёт о встроенной учётной записи "Администратор" и нет возражений против того, чтобы "учётка" администратора домена именовалась так же, как и "учётка" локального администратора, то можно обойтись без сценариев. Смотрите групповую политику: Конфигурация компьютера - Конфигурация Windows - Параметры безопасности - Локальные политики - Параметры безопасности - политика "Учётные записи: переименование учётной записи администратора".

Цитата Dark-Dragon @
... и поменять пароль.
Смотрите первый сценарий в сообщении #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
Цитата Bugavka @
Какие есть критерии для отбора...
Свойства объекта типа ГРУППА, например. Если не знаете списка свойств, то загляните в MSDN:
http://msdn.microsoft.com/en-us/library/aa706021.aspx
Цитата Bugavka @
... как в кде их указать?
Всё зависит от того, что именно нужно выбрать.

Автор: 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
Цитата Lachdanan @
а если это всё засунуть в html то нифига не работает
Под 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}>
    <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>
(сейчас проверить не могу, IE недоступен)

Автор: 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
Цитата qwert@ @
Что-то в этом духе: fso.deletefile "C:\Новая папка\*.*",1

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
Цитата SIW @
Из скрипта VBA Надо запестить на выполнение "другой скрипт.vbs"

<{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
Цитата Tapac @
извините за оффтоп, у кого есть книга по этим .vbs скриптам ?

У Майкрософта... точно есть


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
Цитата alec1024 @
...можно ли зделать так чтобы подставлялся не логин а полное имя с фамилией из AD
Приведённый Вами сценарий успешно выполняет указанную задачу. :)
Совет: вместо конструкции
<{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 @
Цитата alec1024 @
...можно ли зделать так чтобы подставлялся не логин а полное имя с фамилией из AD
Приведённый Вами сценарий успешно выполняет указанную задачу. :)
Совет: вместо конструкции
<{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
Цитата alec1024 @
... без указывания конкретного компа?
Здесь всё просто:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Set objWSNet = CreateObject("WScript.Network")
    strComputer = objWSNet.ComputerName
    Set objWSNet = Nothing

Цитата alec1024 @
А есть возможность этот скрипт запустить автоматом на всех компах домена...
Подразумевается использование групповой политики Конфигурация пользователя - Конфигурация Windows - Сценарии (вход/выход из системы)? Если - "да", то нельзя.
Впрочем, загляните сюда Полезные скрипты, сообщение #93. Можно попробовать задействовать указанный там способ.

Автор: illus 15.12.08, 10:25
подскажите пожалуйста, как по логину в AD получить имя компьютера на котором он сидит? на входе логин, на выходе имя компьютера, в идеале с ip)

Автор: Dmitrii 15.12.08, 14:35
Цитата illus @
... как по логину в AD получить имя компьютера на котором он сидит? на входе логин, на выходе имя компьютера, в идеале с ip)
Обратите внимание на сценарий, помещённый в сообщении 110 данной темы:
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
Цитата illus @
... адрес строки и подобные аттрибуты не указаны
Адрес строки с ошибкой указан: 53. Мы с Вами на него просто не обратили внимание. :)

Цитата illus @
в сообщении 110 данной темы я взял целиком код, однако, при выполнении появляется консольное окошко с данной ошибкой...
Следовало внимательно просмотреть код, прежде, чем использовать. В строке 53 надо указать реальное имя домена, вместо моего комментария.
Впрочем, чтобы не "связываться" с константой, строку
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

Цитата illus @
... Потому как скрипт утверждает что сетевой путь не найден.
У меня сценарий прекрасно работает.
Если ошибка возникает при использовании именно такого варианта сценария, то попробуйте выражение
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
Подскажите скрипт изменения настроек энергосбережения.

Добавлено
Что-то много винда в реестре правит :wall: :blink:

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
Цитата ^D^ima @
Подскажите скрипт изменения настроек энергосбережения.

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
Цитата mr.Neo @
интересует скриптик для отключения/включения сетевого интерфейса...

Здравствуйте.. Вот скрипт который пингует хост и по качеству пинга выключает и включает сеть

Автор: Спящий 06.07.09, 13:58
Есть у кого внятные примеры работы с ODBC на VBScript/JScript?

Автор: AlexJ 06.07.09, 15:54
Цитата mr.Neo @
интересует скриптик для отключения/включения сетевого интерфейса...

Сообщение N-22 в этой теме

Автор: Спящий 06.07.09, 16:12
Цитата Спящий @
Есть у кого внятные примеры работы с ODBC на VBScript/JScript?
Уже нашел. Не надо.

Автор: 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, т.е. чтобы предпоследний октет скрипт генерировал в соответствии с тем, как настроена ЛВС? <_< :blink:
(или чтобы скрипт брал текущий 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, немогу понять что не так?
Будте любезны, если сможете решить мою проблему, запостите код пожалуйста.. :'( :unsure:

( по строковым ф-циям почему например при dim a & a = array(192,168,0,191) & b = a(4) & msgbox b в ответ приходит ошибка? :(..)

Автор: Akina 16.09.09, 14:14
Вместо использования instr посмотрите описания функций Split и Join.
Цитата Alexsz @
немогу понять что не так?

Ошибка синтаксиса.
Цитата Alexsz @
по строковым ф-циям почему например при dim a & a = array(192,168,0,191) & b = a(4) & msgbox b в ответ приходит ошибка?

Во-первых, тут нет строковых функций. Во-вторых, все массивы zero-based.
Цитата Alexsz @
Проблема в знаниях

Ну так изучайте язык, но на более простом материале.

Автор: 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
Цитата Alexsz @
В конце можно при желании прикрутить ребут машины..)

А смысл? достаточно опустить и снова поднять интерфейс - а на ХР и старше так и вовсе ничего не нужно, применяется на лету.
Единственный минус такого подхода - не сбрасывается резервирование адреса на DHCP-сервере. Плюс некоторое время висит фантом в НетБИОС-окружении.

Автор: AlexJ 18.09.09, 16:27
Цитата Akina @
Единственный минус такого подхода - не сбрасывается резервирование адреса на DHCP-сервере.

Akina абсолютно прав, и плюс ко всему даже после перезагрузки перезагрузки ИПшник не сброситься, не видел я чтоб сброс кэша DHCP был меньше 15 минут, а обычно неделя или больше. "Сбить" DHCP сервак можно только сменив МАС адрес сетевухи или "вписаться" самому в протокол DHCP и отвергать предложения сервака получить "старый" ИП.

Автор: Akina 18.09.09, 17:31
Цитата AlexJ @
не видел я чтоб сброс кэша DHCP был меньше 15 минут, а обычно неделя или больше

Вообще-то это определяется параметром Leased Time самогО DHCP-сервера.

Автор: AlexJ 21.09.09, 01:27
Цитата Akina @
Вообще-то это определяется параметром Leased Time самогО DHCP-сервера.

Ну так о нем и говорю, редко кто ставит меньше 15 минут, а обычно все ставят неделю, после чего кэш DHCP сервака сбрасывается, если не было больше подключений с определенного МАС-адреса.

Автор: Alexsz 21.09.09, 13:18
Цитата Akina @
Цитата
Плюс некоторое время висит фантом в НетБИОС-окружении.

Akina
А если сбросить командой netsh winsock reset? Тогда этот самый фантом исчезнет?

Автор: Akina 21.09.09, 14:02
Цитата Alexsz @
А если сбросить командой netsh winsock reset? Тогда этот самый фантом исчезнет?)

Если сбросить на мастер-браузере и на рабстанции - да.

Сообщения были разделены в тему "Скрипт для биллинга"

Автор: 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
Цитата Alexsz @
что модифицировать нужно,чтобы скрипт выводил данные в процентах?

Получить не только объём свободного пространства (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
Цитата Chingizhan @
скрипт будет актуален для многих админов.

Однозначно нет. А вот для ломастеров - да.
Цитата Chingizhan @
Буду очень благодарен за скрипт!

Вот прям готовый тебе вынь да положь? так ты разделом ошибся, тебе в ПОМОЩЬ СТУДЕНТАМ
А если всё-таки намерен делать сам- показывай, что уже сделано и в чём возникла проблема.

Автор: 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
Цитата blackangel @
установить msi пакет на удаленную машину

silent? или требуется интерактивное управление пакетом?

Автор: blackangel 24.11.09, 09:50
Цитата Akina @
silent? или требуется интерактивное управление пакетом?

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
Цитата Akina @
CallByName или его аналога в WSH нет.

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
Цитата Alexsz @
Есть список логинов (юзвери)...
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
Цитата AGhost @
... что необходимо чтобы разблокировать скриптом?
В самом общем случае нужно то же, что и для выполнения любого другого сценария на контроллере - достаточные полномочия.
Сюда нужно отнести: уровень привилегий "учётки", от имени которой выполняется сценарий, отсутствие ограничений со стороны групповой политики, отсутствие блокировок со стороны локального ПО, обеспечивающего безопасность контроллера (например, UAC, брандмауэра).

Цитата AGhost @
... скрипт выдает acces denied на SetInfo.. почему?..
Сценарий запускается с удалённой станции или непосредственно на контроллере домена?
Другие сценарии, вносящие изменения в AD через провайдер WinNT, работают нормально (в тех же условиях, что и обсуждаемый сценарий, разумеется)?

Автор: AGhost 24.06.11, 12:56
Запускается на удаленной машине из под админского аккаунта, из под которого который можно ручками в оснастке делать unlock логинов...

p.s. можно ли как то обойтись без setinfo ??

Автор: Dmitrii 27.06.11, 09:53
Цитата AGhost @
можно ли как то обойтись без setinfo ?
Нет.

AGhost, без ответа остался вопрос: "Другие сценарии, вносящие изменения в AD через провайдер WinNT, работают нормально (в тех же условиях, что и обсуждаемый сценарий, разумеется)"?

Автор: AGhost 05.07.11, 06:25
Цитата Dmitrii @
Цитата AGhost @
можно ли как то обойтись без setinfo ?
Нет.

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 код становится намного читабельней.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)