На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Windows
1. Указывайте версию Вашей ОС.
2. Запрещается размещать запросы и ссылки на кряки, серийники и т.п., а также вопросы нарушения лицензии ПО и его взлома.
3. Не разрешается давать советы из разряда "Поставь Linux".
4. Переустановка ОС - крайнее и безотказное лекарство, которое знают все. В таких советах никто не нуждается.
5. При публикации скриптов пользоваться тегами code. Тип подсветки кода выбирать строго в соответствии с языком публикуемого кода.
6. Прежде чем задать вопрос, обязательно загляните в FAQ и следуйте написанным рекомендациям для устранения проблемы. И если не помогло, а поиск по разделу не дал результатов - только тогда задавайте вопрос на форуме.
7. Вопросы, связанные с проблемами ПО, задавайте в разделе Программное обеспечение
Модераторы: Akina
Страницы: (22) « Первая ... 18 19 [20] 21 22   ( Перейти к последнему сообщению )  
> Полезные скрипты , WSH (js, vbs) + WMI
    Alexsz, первый вопрос остался без ответа. Повторяю его в иной форме.
    Какой атрибут схемы AD подразумевается под словом "логин": userPrincipalName, sAMAccountName, displayName, какой-то другой..?
      Dmitrii
      userPrincipalName атрибут, первый ваш пост немного не понял..)
        Alexsz, попробуйте так:
        ExpandedWrap disabled
          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
          Доброго дня! Ни у кого не завалялось скрипта, копирующего некую иерархию каталогов, с файлами, по сети с сохранением прав доступа пользователей ActiveDirectory?
          Сообщение отредактировано: AlexCray -
            Доброго времени суток!
            Ребят, выручите, нужен скрипт, перемещающий отключенных или неактивных в течении определенного количества дней пользователей и компьютеров в AD в отдельное подразделение.

            Спасиб заранее.
              Цитата pride.psy @
              нужен скрипт, перемещающий отключенных ... пользователей и компьютеров в AD в отдельное подразделение
              Пример сценария для перемещения отключенных "учёток" пользователей и компьютеров в отдельное подразделение (предполагается, что оно уже существует в AD):
              ExpandedWrap disabled
                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 объекта типа "Пользователь".
              Учтите, что это не реплицируемый атрибут, поэтому в мультиконтроллерном домене надо опросить все контроллеры и выбрать наиболее "свежую" дату из полученных.
              Сообщение отредактировано: Dmitrii -
                Подскажите как изменить скрипт приведенный выше по теме:

                ExpandedWrap disabled
                  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), кроме айпишника, который и так уже статично задан. Заранее большое спасибо.

                ----------------------------------------
                Пришли сами к такому решению:
                ExpandedWrap disabled
                  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
                Сообщение отредактировано: arr1val -
                  Подскажите пожалуйста, как запустить два процесса параллельно? А именно нужно вот что:
                  Устанавливаю апдейты для Винды на удаленной машине след образом
                  ExpandedWrap disabled
                    RetCode = WshShell.Run("d:\psexec.exe \\comp1 -s \\server\enu\windowsXP-KB957097-x86.exe /quiet /norestart", 1, True)
                    MsgBox "Обновление завершено! Код возврата - " & RetCode


                  В первой строке происходит обновление, а затем, когда обновление закончится выводится сообщение с кодом возврата(успешно выполнена установка или нет). Таким образом можно ПООЧЕРЕДНО устанавливать на все компы организации нужное обновление...
                  Господа! Как запустить эти процессы параллельно на нескольких компьютерах и от каждого процесса получить код возврата?? Знаю, что есть асинхронные и полусинхронные вызовы, но ка реализовать не знаю((( Или может есть другие способы? Помогите плз..
                    Ммм... WaitForSingleObject/WaitForSingleObjectEx... но вот как это в скрипте - навскидку не сообразится что-то.
                      Цитата Akina @
                      Ммм... WaitForSingleObject/WaitForSingleObjectEx... но вот как это в скрипте - навскидку не сообразится что-то.

                      эххх:(( буду продолжать ломать голову.
                        blackangel, попробуй написать еще один скрипт, который будет вызывать твой скрипт с параметром CompName столько раз, на сколько компов надо проинсталить. Только при вызове твоего скрипта не ждать его завершения. В результате ты получишь много окошек с результатами выполнения :)
                          Цитата blackangel @
                          ... как запустить два процесса параллельно? ... есть асинхронные и полусинхронные вызовы, но ка реализовать не знаю...
                          И из запускаемых процессов, и из их откликов будут выстраиваться очереди, хотим мы того или не хотим. Но так как отклики могут приходить асинхронно, то и обрабатывать их можно в асинхронном режиме. Использовать для этого можно механизмы WMI.
                          Поищите материал по ключам: SWbemSink, ExecQueryAsync, Sink_OnObjectReady (более деятельно сейчас помочь Вам ничем не могу).
                          Сообщение отредактировано: Dmitrii -
                            Доброго времени суток!
                            Хочу обратиться к вам за советом или помощью -
                            С WMI еще дела иметь не приходилось, опыта, соответственно нет.

                            Задача следующая:
                            Есть группа компьютеров с Windows XP Professional SP3, объединенных в одноранговую сеть и распределенных по территории компании. Есть "рабочая станция администратора". Для компьютеров существует некая задача распределенных вычислений. Нужно: с рабочей станции администратора инициировать локальный вход на группе компьютеров(имя-пароль пользователя известны) и запустить на них некое приложение.

                            Возможно ли сделать такое средствами WMI и в какую сторону копать?
                              Цитата Kevin-Nash @
                              ... с рабочей станции администратора инициировать локальный вход на группе компьютеров(имя-пароль пользователя известны)...
                              Стандартными средствами сценариев (в том числе и с помощью WMI) этого сделать нельзя.
                              Сообщение отредактировано: Dmitrii -
                                Реализация возможности просмотра подключений флешек в домене.
                                Создаем файл usb.mof

                                ExpandedWrap disabled
                                  #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


                                ExpandedWrap disabled
                                  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


                                ExpandedWrap disabled
                                  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
                                Сообщение отредактировано: agem -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (22) « Первая ... 18 19 [20] 21 22 


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0611 ]   [ 15 queries used ]   [ Generated: 28.04.24, 10:23 GMT ]