
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.75] |
![]() |
|
Страницы: (22) « Первая ... 18 19 [20] 21 22 ( Перейти к последнему сообщению ) |
Сообщ.
#286
,
|
|
|
Alexsz, первый вопрос остался без ответа. Повторяю его в иной форме.
Какой атрибут схемы AD подразумевается под словом "логин": userPrincipalName, sAMAccountName, displayName, какой-то другой..? |
Сообщ.
#287
,
|
|
|
Dmitrii
userPrincipalName атрибут, первый ваш пост немного не понял..) |
Сообщ.
#288
,
|
|
|
Alexsz, попробуйте так:
![]() ![]() 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 |
Сообщ.
#289
,
|
|
|
Доброго дня! Ни у кого не завалялось скрипта, копирующего некую иерархию каталогов, с файлами, по сети с сохранением прав доступа пользователей ActiveDirectory?
|
Сообщ.
#290
,
|
|
|
Доброго времени суток!
Ребят, выручите, нужен скрипт, перемещающий отключенных или неактивных в течении определенного количества дней пользователей и компьютеров в AD в отдельное подразделение. Спасиб заранее. |
Сообщ.
#291
,
|
|
|
Цитата pride.psy @ Пример сценария для перемещения отключенных "учёток" пользователей и компьютеров в отдельное подразделение (предполагается, что оно уже существует в AD):нужен скрипт, перемещающий отключенных ... пользователей и компьютеров в AD в отдельное подразделение ![]() ![]() 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 объекта типа "Пользователь". Учтите, что это не реплицируемый атрибут, поэтому в мультиконтроллерном домене надо опросить все контроллеры и выбрать наиболее "свежую" дату из полученных. |
Сообщ.
#292
,
|
|
|
Подскажите как изменить скрипт приведенный выше по теме:
![]() ![]() 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), кроме айпишника, который и так уже статично задан. Заранее большое спасибо. ---------------------------------------- Пришли сами к такому решению: ![]() ![]() 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 |
Сообщ.
#293
,
|
|
|
Подскажите пожалуйста, как запустить два процесса параллельно? А именно нужно вот что:
Устанавливаю апдейты для Винды на удаленной машине след образом ![]() ![]() RetCode = WshShell.Run("d:\psexec.exe \\comp1 -s \\server\enu\windowsXP-KB957097-x86.exe /quiet /norestart", 1, True) MsgBox "Обновление завершено! Код возврата - " & RetCode В первой строке происходит обновление, а затем, когда обновление закончится выводится сообщение с кодом возврата(успешно выполнена установка или нет). Таким образом можно ПООЧЕРЕДНО устанавливать на все компы организации нужное обновление... Господа! Как запустить эти процессы параллельно на нескольких компьютерах и от каждого процесса получить код возврата?? Знаю, что есть асинхронные и полусинхронные вызовы, но ка реализовать не знаю((( Или может есть другие способы? Помогите плз.. |
![]() |
Сообщ.
#294
,
|
|
Ммм... WaitForSingleObject/WaitForSingleObjectEx... но вот как это в скрипте - навскидку не сообразится что-то.
|
Сообщ.
#295
,
|
|
|
Цитата Akina @ Ммм... WaitForSingleObject/WaitForSingleObjectEx... но вот как это в скрипте - навскидку не сообразится что-то. эххх:(( буду продолжать ломать голову. |
Сообщ.
#296
,
|
|
|
blackangel, попробуй написать еще один скрипт, который будет вызывать твой скрипт с параметром CompName столько раз, на сколько компов надо проинсталить. Только при вызове твоего скрипта не ждать его завершения. В результате ты получишь много окошек с результатами выполнения
![]() |
Сообщ.
#297
,
|
|
|
Цитата blackangel @ И из запускаемых процессов, и из их откликов будут выстраиваться очереди, хотим мы того или не хотим. Но так как отклики могут приходить асинхронно, то и обрабатывать их можно в асинхронном режиме. Использовать для этого можно механизмы WMI.... как запустить два процесса параллельно? ... есть асинхронные и полусинхронные вызовы, но ка реализовать не знаю... Поищите материал по ключам: SWbemSink, ExecQueryAsync, Sink_OnObjectReady (более деятельно сейчас помочь Вам ничем не могу). |
Сообщ.
#298
,
|
|
|
Доброго времени суток!
Хочу обратиться к вам за советом или помощью - С WMI еще дела иметь не приходилось, опыта, соответственно нет. Задача следующая: Есть группа компьютеров с Windows XP Professional SP3, объединенных в одноранговую сеть и распределенных по территории компании. Есть "рабочая станция администратора". Для компьютеров существует некая задача распределенных вычислений. Нужно: с рабочей станции администратора инициировать локальный вход на группе компьютеров(имя-пароль пользователя известны) и запустить на них некое приложение. Возможно ли сделать такое средствами WMI и в какую сторону копать? |
Сообщ.
#299
,
|
|
|
Цитата Kevin-Nash @ Стандартными средствами сценариев (в том числе и с помощью WMI) этого сделать нельзя. ... с рабочей станции администратора инициировать локальный вход на группе компьютеров(имя-пароль пользователя известны)... |
Сообщ.
#300
,
|
|
|
Реализация возможности просмотра подключений флешек в домене.
Создаем файл usb.mof ![]() ![]() #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 ![]() ![]() 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 ![]() ![]() 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 |