Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[35.173.48.18] |
|
Страницы: (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 |