Показать полную графическую версию : [решено] Logon script для компьютеров в группе AD
Rolenarim
25-09-2015, 08:35
Добрый день.
Есть скрипт VBS для пользователей, который запускается через GPO при входе пользователя в систему.
Все бы ничего, но он, как ему и положено, также запускается и на терминальном сервере, что не рационально.
Есть желание добавить в скрипт сначала проверку компьютера, на то, что он входит в группу компьютеров AD (например SC) и уже тогда полностью отрабатывать скрипт, если данного компьютера нет в группе, то завершение скрипта.
Сначала хотел прописать наличие имени компьютера в файле SC.txt, но это будет нелогично, ведь компьютеры могут добавиться и каждый раз придется править также этот файл.
Надеюсь на вашу помощь в доработке скрипта.
входит в группу компьютеров AD (например SC) »
«группу» следует понимать как «OU»?
Rolenarim
25-09-2015, 09:45
Да, совершенно верно.
CN=SC,OU=Group,DC=SRV,DC=RU
Ну, например:
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
Скрипт запускается, но желаемого результата нет.
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 не входит - скрипт завершается
хотя данная машина есть в группе. »
Выдается сообщение "Domain Controllers" и он действительно входит в подразделение Domain Controllers, но он также входит в Group, в подраздел SC »
Машина не может быть одновременно в нескольких OU. Я не случайно спрашивал, что Вы имеете в виду под «группа».
Покажите скриншот того, что Вы именуете:
он также входит в Group, в подраздел SC »
Я подобное решал фильтром по процессу 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 (file://\\checkcfg_urc\Checkcfg.exe)", Hide_Window)
filetxt.WriteLine("Запускаем Checkcfg ")
Rolenarim
26-09-2015, 11:15
Nand,
Хороший вариант.
Но для общего понимания надо и с первым разобраться )
Во вложении скрины ветки AD.
Я конечно понимаю что это несколько не то об чем спрашивается, но не проще ли не запускать логон скрипт через политики в определенных OU. имхо в GPO это решается проще и быстрее.
Rolenarim
26-09-2015, 13:52
Elven,
Предлагаете создать OU=Computers1 перенести в него из OU=Computers нужные машины и создать Dafault policy для нее с нужным скриптом?
Rolenarim, а разве OU с указанными компьютерами нет? Это ведь указывалось в условии.
Rolenarim
28-09-2015, 07:11
На данный момент все компьютеры находятся в 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
Спасибо за помощь.
Rolenarim, а разве OU с указанными компьютерами нет? Это ведь указывалось в условии. »
Нет. По скриншоту видно, что «SC» — это группа безопасности.
и внутри нее подгруппа SC (не знаю как она характеризуется) »
Вот это — именно группа безопасности, а не OU.
В этом случае проверку можно обустроить следующим образом (на основе IsMember2 (http://www.rlmueller.net/Programs/IsMember2.txt), работает и для опосредованного членства в группе):
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
'=============================================================================
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2024, Jelsoft Enterprises Ltd.