PDA

Показать полную графическую версию : [решено] Logon script для компьютеров в группе AD


Rolenarim
25-09-2015, 08:35
Добрый день.

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

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

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

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

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

Iska
25-09-2015, 09:34
входит в группу компьютеров AD (например SC) »
«группу» следует понимать как «OU»?

Rolenarim
25-09-2015, 09:45
Да, совершенно верно.

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

Iska
25-09-2015, 10:39
Ну, например:
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 не входит - скрипт завершается

Iska
25-09-2015, 15:04
хотя данная машина есть в группе. »
Выдается сообщение "Domain Controllers" и он действительно входит в подразделение Domain Controllers, но он также входит в Group, в подраздел SC »
Машина не может быть одновременно в нескольких OU. Я не случайно спрашивал, что Вы имеете в виду под «группа».

Покажите скриншот того, что Вы именуете:
он также входит в Group, в подраздел SC »

Nand
25-09-2015, 21:47
Я подобное решал фильтром по процессу 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.

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

Rolenarim
26-09-2015, 13:52
Elven,

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

Elven
26-09-2015, 23:39
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

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

Iska
28-09-2015, 15:28
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