Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Logon script для компьютеров в группе AD (http://forum.oszone.net/showthread.php?t=305865)

Rolenarim 25-09-2015 08:35 2557439

Logon script для компьютеров в группе AD
 
Добрый день.

Есть скрипт VBS для пользователей, который запускается через GPO при входе пользователя в систему.

Все бы ничего, но он, как ему и положено, также запускается и на терминальном сервере, что не рационально.

Есть желание добавить в скрипт сначала проверку компьютера, на то, что он входит в группу компьютеров AD (например SC) и уже тогда полностью отрабатывать скрипт, если данного компьютера нет в группе, то завершение скрипта.

Сначала хотел прописать наличие имени компьютера в файле SC.txt, но это будет нелогично, ведь компьютеры могут добавиться и каждый раз придется править также этот файл.

Надеюсь на вашу помощь в доработке скрипта.

Iska 25-09-2015 09:34 2557449

Цитата:

Цитата Rolenarim
входит в группу компьютеров AD (например SC) »

«группу» следует понимать как «OU»?

Rolenarim 25-09-2015 09:45 2557450

Да, совершенно верно.

CN=SC,OU=Group,DC=SRV,DC=RU

Iska 25-09-2015 10:39 2557463

Ну, например:
Код:

Option Explicit

If StrComp( _
                GetObject("LDAP://" & WScript.CreateObject("ADSystemInfo").ComputerName).Parent, _
                "LDAP://CN=SC,OU=Group,DC=SRV,DC=RU", _
                vbTextCompare _
        ) = 0 Then
       
        ' Place your code here
End If

WScript.Quit 0


Rolenarim 25-09-2015 14:19 2557544

Скрипт запускается, но желаемого результата нет.

Код:

Option Explicit

If StrComp( _
                GetObject("LDAP://" & WScript.CreateObject("ADSystemInfo").ComputerName).Parent, _
                "LDAP://CN=SC,OU=Group,DC=SRV,DC=RU", _
                vbTextCompare _
        ) = 0 Then
msgbox ("da")
else
msgbox ("net")

End If

Результат "net", хотя данная машина есть в группе.

Возможно я не правильно принимаю параметры.

При проверке на сервере:
Код:

Function GetComputerOU
        Dim objSysInfo: Set objSysInfo = CreateObject("ADSystemInfo")
        Dim objComputer: Set objComputer = GetObject("LDAP://" & objSysInfo.ComputerName)
        Dim objOU : Set objOU = GetObject(objComputer.Parent)
        GetComputerOU = objOU.OU
End Function

Wscript.Echo GetComputerOU

Выдается сообщение "Domain Controllers" и он действительно входит в подразделение Domain Controllers, но он также входит в Group, в подраздел SC
А при запуске на рабочей станции отображается пустое окно.

Если запустить тоже самое с параметром "LDAP://CN=SC,OU=Group,DC=SRV,DC=RU" то на обеих машинах отображается Group.

В результате должно получиться:
SRV1 входит в подгруппу SC, группы Group - скрипт продолжается
Comp1 не входит - скрипт завершается

Iska 25-09-2015 15:04 2557579

Цитата:

Цитата Rolenarim
хотя данная машина есть в группе. »

Цитата:

Цитата Rolenarim
Выдается сообщение "Domain Controllers" и он действительно входит в подразделение Domain Controllers, но он также входит в Group, в подраздел SC »

Машина не может быть одновременно в нескольких OU. Я не случайно спрашивал, что Вы имеете в виду под «группа».

Покажите скриншот того, что Вы именуете:
Цитата:

Цитата Rolenarim
он также входит в Group, в подраздел SC »


Nand 25-09-2015 21:47 2557737

Я подобное решал фильтром по процессу rdp.
Код:

strComputer = "."
rdpProc = 1
Set objWMIService = GetObject( _
"winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _
"SELECT * FROM Win32_Process" & _
" WHERE Name = 'rdpclip.exe'",,48)
For Each objItem in colItems
If objItem.Name = "rdpclip.exe" Then
rdpProc = 0
exit for
End If
Next
If rdpProc = 0 Then
filetxt.WriteLine("Терминальный сеанс Checkcfg не нужен")
Else
' checkcfg
call objWSH.Run("\....\checkcfg\Checkcfg.exe", Hide_Window)
filetxt.WriteLine("Запускаем Checkcfg ")


Rolenarim 26-09-2015 11:15 2557838

Вложений: 2
Nand,

Хороший вариант.

Но для общего понимания надо и с первым разобраться )

Во вложении скрины ветки AD.

Elven 26-09-2015 11:29 2557839

Я конечно понимаю что это несколько не то об чем спрашивается, но не проще ли не запускать логон скрипт через политики в определенных OU. имхо в GPO это решается проще и быстрее.

Rolenarim 26-09-2015 13:52 2557878

Elven,

Предлагаете создать OU=Computers1 перенести в него из OU=Computers нужные машины и создать Dafault policy для нее с нужным скриптом?

Elven 26-09-2015 23:39 2558003

Rolenarim, а разве OU с указанными компьютерами нет? Это ведь указывалось в условии.

Rolenarim 28-09-2015 07:11 2558404

На данный момент все компьютеры находятся в 2-х OU (Domain Controllers и Computers), Ни та ни другая OU не содержит того перечня компьютеров (вместе взятых), необходимых для обрабатываемого скрипта.

Однако есть еще OU Group и внутри нее подгруппа SC (не знаю как она характеризуется), в нее я и включил нужный список компьютеров.

UPD:

В общем создал дополнительные OU, в которых разбил более детально все машины и сделал скрипт на основе предложения Iska:

Код:

If StrComp( _
                GetObject("LDAP://" & WScript.CreateObject("ADSystemInfo").ComputerName).Parent, _
                "LDAP://OU=DopOU,DC=SRV,DC=RU", _
                vbTextCompare _
        ) = 0 Then
       
        ' Place your code here
End If

Спасибо за помощь.

Iska 28-09-2015 15:28 2558564

Цитата:

Цитата Elven
Rolenarim, а разве OU с указанными компьютерами нет? Это ведь указывалось в условии. »

Нет. По скриншоту видно, что «SC» — это группа безопасности.

Цитата:

Цитата Rolenarim
и внутри нее подгруппа SC (не знаю как она характеризуется) »

Вот это — именно группа безопасности, а не OU.

В этом случае проверку можно обустроить следующим образом (на основе IsMember2, работает и для опосредованного членства в группе):
Скрытый текст
Код:

Option Explicit

Dim strGroup

Dim objGroupList
Dim objADObject


strGroup = "SC"

Set objADObject = GetObject("LDAP://" & WScript.CreateObject("ADSystemInfo").ComputerName)

If IsMember(strGroup) Then
        ' Place your code here
End If

WScript.Quit 0
'=============================================================================

'=============================================================================
Function IsMember(ByVal strGroup)
        If (IsEmpty(objGroupList) = True) Then
                Set objGroupList = WScript.CreateObject("Scripting.Dictionary")
                Call LoadGroups(objADObject)
        End If
       
        IsMember = objGroupList.Exists(strGroup)
End Function
'=============================================================================

'=============================================================================
Sub LoadGroups(ByVal objADObject)
        Dim colstrGroups, objGroup, j
       
        objGroupList.CompareMode = vbTextCompare
        colstrGroups = objADObject.memberOf
       
        If (IsEmpty(colstrGroups) = True) Then
                Exit Sub
        End If
       
        If (TypeName(colstrGroups) = "String") Then
                colstrGroups = Replace(colstrGroups, "/", "\/")
               
                Set objGroup = GetObject("LDAP://" & colstrGroups)
               
                If (objGroupList.Exists(objGroup.sAMAccountName) = False) Then
                        objGroupList.Add objGroup.sAMAccountName, True
                        Call LoadGroups(objGroup)
                End If
                Exit Sub
        End If
       
        For j = LBound(colstrGroups) To UBound(colstrGroups)
                colstrGroups(j) = Replace(colstrGroups(j), "/", "\/")
               
                Set objGroup = GetObject("LDAP://" & colstrGroups(j))
               
                If (objGroupList.Exists(objGroup.sAMAccountName) = False) Then
                        objGroupList.Add objGroup.sAMAccountName, True
                        Call LoadGroups(objGroup)
                End If
        Next
End Sub
'=============================================================================



Время: 09:40.

Время: 09:40.
© OSzone.net 2001-