Войти

Показать полную графическую версию : [решено] просмотр активных пользователей в АД


Страниц : 1 [2]

DmitriiV
05-09-2012, 09:55
... а тут утилита нужна...Можно и без утилиты - сценарием.
... долго сканит компьютеры...Да, это самый медленный способ, но зато наиболее достоверный.
Когда-то писал себе такой сценарий:

Dim objWsNet, strDomain, strThisComputer, strTranslator, blnIsConsole
Dim objWShell, objExec, objOutStream
Dim strUser, strTemp, strTemp2, xAnswer
Dim objDict, strKey
Dim objFS, objFile, strList, strLog

strLog = "LoggedUsers_List.log"
Set objFS = CreateObject("Scripting.FileSystemObject")
strTranslator = objFS.GetBaseName(WScript.FullName)
If StrComp(strTranslator, "cscript", vbTextCompare) = 0 Then
blnIsConsole = True
Else
blnIsConsole = False
End If
Set objWShell = CreateObject("WScript.Shell")
If Not blnIsConsole Then
xAnswer = MsgBox("Сценарий ориентирован на консольный режим." & vbNewLine & "Перезапустить его с помощью консоли?", vbYesNo + vbQuestion, "Выбор режима работы")
If xAnswer = vbNo Then
WScript.Echo "Выполнение сценария прекращено."
Else
objWShell.Run "cscript.exe " & WScript.ScriptFullName, 1
End If
Else
Set objWsNet = CreateObject("WScript.Network")
strDomain = objWsNet.UserDomain
strThisComputer = objWsNet.ComputerName
Set objWsNet = Nothing
Set objDict = CreateObject("Scripting.Dictionary")
objDict.CompareMode = 1
Call Comuters_List(objDict)
strUser = vbNullString
For Each strKey In objDict.Keys
If StrComp(strThisComputer, strKey, vbTextCompare) <> 0 Then
Set objExec = objWShell.Exec("ping -n 1 -w 130 " & strKey)
Set objOutStream = objExec.StdOut
strTemp = vbNullString
While Not objOutStream.AtEndOfStream
strTemp = strTemp & Trim(objOutStream.ReadLine())
Wend
If InStr(1, strTemp, "TTL", vbTextCompare) > 0 Then
strUser = Logged_Session(strKey, objDict.Item(strKey))
If Len(strKey) < 8 Then
strTemp = vbTab & vbTab
strTemp2 = vbTab & vbTab
Else
strTemp = vbTab
strTemp2 = vbTab & vbTab
End If
If Len(strUser) > 0 Then
If StrComp(strUser, "Error.", vbTextCompare) <> 0 Then
strList = strList & strKey & strTemp & " = " & strUser & vbNewLine
WScript.StdOut.WriteLine "[ + ] " & strKey & strTemp2 & " = " & strUser
Else
strList = strList & strKey & strTemp & " = Ошибка при определении сеанса" & vbNewLine
WScript.StdOut.WriteLine "[ + ] " & strKey & strTemp2 & " = Ошибка при определении сеанса"
End If
Else
WScript.StdOut.WriteLine "[ + ] " & strKey & strTemp2 & " = Сеанс не обнаружен"
End If
Else
WScript.StdOut.WriteLine "[ - ] " & strKey
End If
End If
Next
Set objOutStream = Nothing
Set objExec = Nothing
If objDict.Count > 0 Then
strLog = objFS.BuildPath(objFS.GetParentFolderName(WScript.ScriptFullName), strLog)
Set objFile = objFS.CreateTextFile(strLog, True)
objFile.Write strList
objFile.Close
Set objFile = Nothing
objWShell.Run "notepad.exe " & strLog, 1
objDict.RemoveAll
Else
WScript.Echo "Ничего не найдено."
End If
Set objDict = Nothing
End If
Set objWShell = Nothing
Set objFS = Nothing
WScript.Quit 0


'=====

Function Comuters_List(objDictionary)
Dim objRootDSE, strDomain, strTemp, blnTemp
Dim objConnection, objCommand, objRSet
Const ADS_SCOPE_SUBTREE = 2
Const ADS_UF_ACCOUNTDISABLE = 2

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
strCommandText = "SELECT cn,userAccountControl,operatingSystem FROM 'LDAP://" & strDomain & "' WHERE objectCategory='Computer'"
objCommand.CommandText = strCommandText
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Timeout") = 30
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
Set objRSet = objCommand.Execute
objRSet.MoveFirst
Do
If Not (objRSet.Fields("userAccountControl").Value And ADS_UF_ACCOUNTDISABLE) Then
strTemp = objRSet.Fields("operatingSystem").Value
If Not IsNull(strTemp) Then
If InStr(1, strTemp, "server", vbTextCompare) = 0 Then
If InStr(1, strTemp, "2000", vbTextCompare) > 0 Then
blnTemp = False
Else
blnTemp = True
End If
strTemp = objRSet.Fields("cn").Value
If Not objDictionary.Exists(strTemp) Then
objDictionary.Add strTemp, blnTemp
End If
End If
End If
End If
objRSet.MoveNext
Loop While Not objRSet.EOF
Set objRSet = Nothing
Set objCommand = Nothing
objConnection.Close
Set objConnection = Nothing
Call Sorting_Dictionary(objDictionary)
End Function

'=====

Function Logged_Session(strComputer, blnFlag)
Dim objWMI, objCollection, objItem, strName, strTemp
Dim strParamName
Const HKLM = &H80000002
Const strSubKeyName = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"

strParamName = "DefaultUserName"
strName = vbNullString
On Error Resume Next
If blnFlag Then
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
If Err.Number = 0 Then
Set objCollection = objWMI.ExecQuery("SELECT UserName FROM Win32_ComputerSystem")
If Err.Number = 0 Then
For Each objItem In objCollection
strName = objItem.UserName
If Err.Number <> 0 Then
Err.Clear
strName = "Error."
End If
Next
Else
Err.Clear
strName = "Error."
End If
Set objItem = Nothing
Set objCollection = Nothing
Else
Err.Clear
strName = "Error."
End If
Else
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
If Err.Number = 0 Then
objWMI.GetStringValue HKLM, strSubKeyName, strParamName, strName
If Err.Number = 0 Then
If Len(strName) = 0 Then
strName = "идентифицировать сеанс не удалось"
Else
strName = strName & " (актуальность данных не гарантирована)"
strParamName = "DefaultDomainName"
objWMI.GetStringValue HKLM, strSubKeyName, strParamName, strTemp
If Err.Number = 0 Then
If Len(strTemp) > 0 Then
strName = strTemp & "\" & strName
End If
Else
Err.Clear
End If
End If
Else
Err.Clear
strName = "Error."
End If
Else
Err.Clear
strName = "Error."
End If
End If
Set objWMI = Nothing
On Error GoTo 0
Logged_Session = strName
End Function

Проверен для версий 2000 - 7 (не опрашивает компьютеры с ОС серверного типа).
Из-за особенностей "двухтысячной" версии достоверность того, что в настоящий момент сеанс открыт не гарантирована: нужны дополнительные проверки, но они отнимают довольно много времени.

Dosmod
05-09-2012, 10:27
оу спс, щас попробую этот скрипт, это же вбс?

и да, при методе с прогой и батником время начала сеанса юзера отписывает не то которые было в момент входа на сервере а то которое выставлено у юзера на ПК... а там у нас на некоторых системах батарейки накрылись, так время сбивается
да и то что батник кирилицу не знает тоже не очень класно

АП. а каким образом запустить скрипт? при его старте говорит что он ориентирован для консольного режима, предлагает перезапустить в консоле - перезапускаю, за 0,3 секунды промигивает консольное окно и на этом все

DmitriiV
05-09-2012, 11:27
Можете сразу запускать из консоли (через CSCRIPT.EXE).
...перезапускаю, за 0,3 секунды промигивает консольное окно и на этом всеСимптомы похожи на ситуацию, когда запуск выполняется на сервере, а сценарий лежит на сетевом томе. Если так, то просто переместите сценарий на локальный том.

Dosmod
05-09-2012, 12:44
через CSCRIPT.EXE »
на локальном пк пробую запустить - окно на 0,3 сек
на сервере пробую запустить эту программу - тоже всего на 0,3 сек окно

сценарий также пробовал на ПК клиента запускать и на сервере

DmitriiV
05-09-2012, 13:24
Dosmod, для локализации ошибки добавляйте в код отладочные операторы.
Для начала, например, замените оператор Call Comuters_List(objDict) на фрагмент
MsgBox "До вызова Comuters_List()"
Call Comuters_List(objDict)
MsgBox "После вызова Comuters_List()" & vbNewLine & "Кол-во станций: " & objDict.Count
WScript.Quit 0
Ну, и далее в том же духе.

Dosmod
05-09-2012, 13:48
заменил, ситуации не изменилась... всеравно быстро мигает окно

DmitriiV
06-09-2012, 06:47
на локальном пк пробую запустить - окно на 0,3 сек...То есть запускаете консоль, в её окне отдаёте команду вида cscript myscript.vbs, где myscript - имя запускаемого сценария, и окно консоли закрывается?

Dosmod
06-09-2012, 15:41
ну CSCRIPT.EXE запускается всего на 0.3 секунды... но я другим методом через командную строку запускаю, с вашей командой
и получаю вот это:

C:\Documents and Settings\Администратор.NTB.000>cscript "E:\Дошка оголошень\1.vb
s"
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

E:\Дошка оголошень\1.vbs(131, 1) Microsoft VBScript runtime error: Type mismatch
: 'Sorting_Dictionary'

запускаю тот скрипт который ранее поправили для отладки

DmitriiV
06-09-2012, 16:33
Теперь понятно.
Либо удалите вызов функции Sorting_Dictionary() из кода функции Comuters_List(), либо добавьте к сценарию её код, приведённый ниже:

Function Sorting_Dictionary(objDictSorting)
Dim blnStopSort, intNumChange, arrKeys, arrItems, strTemp

arrKeys = objDictSorting.Keys
arrItems = objDictSorting.Items
blnStopSort = False
i = 0
Do
intNumChange = 0
For j = 0 To UBound(arrKeys) - 1
If arrKeys(j) > arrKeys(j + 1) Then
strTemp = arrKeys(j)
arrKeys(j) = arrKeys(j + 1)
arrKeys(j + 1) = strTemp
intNumChange = intNumChange + 1
End If
Next
If intNumChange = 0 Then
blnStopSort = True
Else
If i < UBound(arrKeys) Then
i = i + 1
Else
blnStopSort = True
End If
End If
Loop While Not blnStopSort
For i = 0 To UBound(arrKeys)
arrItems(i) = objDictSorting.Item(arrKeys(i))
Next
objDictSorting.RemoveAll
For i = 0 To UBound(arrKeys)
objDictSorting.Add arrKeys(i), arrItems(i)
Next
Erase arrKeys
Erase arrItems
End Function

Dosmod
06-09-2012, 16:44
добавил функцию - заработало, спс!
правда почемуто админов в сети не показывает... минус рисует на том ПК где щас под своим логином админ работает, и чегото иногда выдает "ошибка при определении сеанса"
ну и да, сканит еще дольше чем через батник с прогой :D
и нету времени начала сеанса...
и почемуто тех юзеров у которых кирилица в названии учетки пропускает

DmitriiV
07-09-2012, 10:06
... админов в сети не показывает...
У нас показывает.
Какая версия ОС на этих узлах?

... минус рисует на том ПК где щас под своим логином админ работает...
Не проходит "пинг". Наиболее вероятные причины:
- ICMP закрыт брандмауэром или "антихакером";
- 130 миллисекунд, используемых в сценарии, маловато для ожидания отклика от опрашиваемого узла.

... выдает "ошибка при определении сеанса"...
Нужна детализация. Для этого надо "развивать" сценарий, т.к. в теперешнем виде подробный анализ ошибок не реализован.

... нету времени начала сеанса...
Опять-таки для этого надо "развивать" сценарий (мне, например, такая информация неинтересна).

... тех юзеров у которых кирилица в названии учетки пропускает
У нас 90% "логинов" на кириллице :)
Вообще говоря, работа сценария никак не связана с языком "логина". Нужна отладка под ваши условия.

Dosmod
07-09-2012, 14:56
Какая версия ОС на этих узлах? »
на всех машинах винХР с сп1-3

- ICMP закрыт брандмауэром или "антихакером"; »
скорей всего, у админов фаервол

Вообще говоря, работа сценария никак не связана с языком "логина". Нужна отладка под ваши условия. »
ну с этим я попоже разберусь, у нас тут с кирилицей в основном только админские учетки




© OSzone.net 2001-2012