четверг, 11 декабря 2008 г.

Как-то с коллегами обсуждалась проблема применения групповых политик в Active Directory (AD), которая заключалась в многократном применении политики к одним и тем же объектам домена. Эта стандартная ситуация явно иллюстрируется следующим примером:

Есть OU (подразделение) БУХГАЛТЕРИЯ, к которому необходимо применить определнную политику. Но в данном подразделении некоторые сотрудники находятся в отпуске, коммандировке, на больничном, в общем отсутствуют на рабочем месте. Встает вопрос как гарантированно применить политику на все компьютеры в этом подразделении? Самый простой вариант - оставить назначенную политику на долгий период, за который люди выйдут из отпуска, приедут из коммандировки и включат компьютеры. Но все это всемя политика будет отрабатывать на остальных компьютерах дополнительно нагревая воздух в кабинетах взмыленными от работы процессорами. Непорядок...

Как этого избежать? Была идея динамического применения групп для фильтрации применения политики.
Создаем группу TMPPOLICY, включаем в нее все компьютеры на которые необходимо применять политику (для случая Machine Policy) и ставим Security Filtering для политики:


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




Const ADS_PROPERTY_APPEND = 3
Const ADS_PROPERTY_DELETE = 4
Const ADS_NAME_INITTYPE_GC = 3
Const ADS_NAME_TYPE_NT4 = 3
Const ADS_NAME_TYPE_1779 = 1
Const DOMAIN_NAME = "DOMAIN"
Const DSN_DOMAIN_NAME = "dc=my,dc=domain,dc=com"
Const TMP_POLICY_GROUP = "TMPPOLICY"
Const LOCATION_TMP_POLICY_GROUP = "Computers"
Const TMP_POLICY_ADMIN = "TMPPOLICYADMIN"
Const TMP_POLICY_ADMIN_PASSWORD = "Qwe4rty7"

Set objNetwork = CreateObject("Wscript.Network")
strNTName = DOMAIN_NAME & "\" & objNetwork.ComputerName & "$"


Set objTrans = CreateObject("NameTranslate")
objTrans.Init ADS_NAME_INITTYPE_GC, ""
objTrans.Set ADS_NAME_TYPE_NT4, strNTName
strUserDN = objTrans.Get(ADS_NAME_TYPE_1779)

Set objConn = CreateObject("ADODB.Connection")
objConn.Provider =
"ADsDSOObject"
objConn.Open
"Active Directory Provider"

Set oMyDS = GetObject("LDAP:")
Set objGroup = oMyDS.OpenDSObject("LDAP://cn="&TMP_POLICY_GROUP&",cn="&LOCATION_TMP_POLICY_GROUP&"," & DSN_DOMAIN_NAME &, TMP_POLICY_ADMIN, TMP_POLICY_ADMIN_PASSWORD,ADS_SECURE_AUTHENTICATION + ADS_SERVER_BIND)

objGroup.PutEx ADS_PROPERTY_DELETE,
"member", Array(strUserDN)
objGroup.SetInfo


В скрипте запросы производятся от имени пользователя TMPPOLICYADMIN, который должен иметь право в домене на создание/удаление/изменение членства в группах.

Таким образом просмотр изменения членства в группе еще можно рассматривать и как отчет о применении политики.

Комментариев нет: