RS: Отчет по членству локальных групп

Скорее всего многим поступала задача от руководства — определить пользователей, которые входят в группу локальных администраторов и многие решали этот вопрос с помощью скриптов, которые есть в интернете. Но все скрипты, которые я видел, хороши до тех пор, пока не сталкиваешься с разноязычными операционными системами в одной компании. В таких случаях группа администраторов может называться «Администраторы», «Administrators», где-то еще как-то, а кому-то вообще нужен отчет по пользователям и группам, которые входят не в группу локальных администраторов, а в группу пользователей удаленного рабочего стола. В итоге я решил написать скрипт, взяв за основу скрипт Sherry Kissinger. Этот скрипт будет создавать собственный класс — Win32_LocalGroupMember. Данный класс обновляется с помощью адвертайзмента и распространяется на коллекцию «All Systems» (либо собственную), либо через Desired Configuration Management.

' Set variables

Set oWMI = GetObject("winmgmts:root\cimv2")
cDQT = Chr(34)
cSQT = Chr(39)
iCimtypeString = 8
sClassName = "Win32_LocalGroupMember"

' Exit script if computer is a Domain Controller

For Each oComputer in oWMI.ExecQuery("Select DomainRole from Win32_ComputerSystem")
	if (oComputer.DomainRole >= 4) then Wscript.Quit
Next

' Clear class if exists

For Each oSubclass in oWMI.SubclassesOf()
	if oSubclass.Path_.Class = sClassName then oWMI.Get(sClassName).Delete_
Next

' Create class

Set oClass = oWMI.Get()
oClass.Path_.Class = sClassName
oClass.Properties_.add "MemberName" , iCimtypeString
oClass.Properties_.add "MemberDomain" , iCimtypeString
oClass.Properties_.add "MemberType" , iCimtypeString
oClass.Properties_.add "GroupName" , iCimtypeString
oClass.Properties_.add "GroupSID" , iCimtypeString
oClass.Properties_("GroupName").Qualifiers_.add "key" , True
oClass.Properties_("MemberName").Qualifiers_.add "key" , True
oClass.Put_

' Return data to class

Set oClass = oWMI.Get(sClassName).SpawnInstance_
For Each oGroup in oWMI.ExecQuery("Select * From Win32_Group Where LocalAccount = 1")
	For Each oGroupUser in oWMI.ExecQuery("Select PartComponent From Win32_GroupUser Where GroupComponent = "_
	&cSQT&"\\\\"&oGroup.Domain&"\\root\\cimv2:Win32_Group.Domain="_
	&cDQT&oGroup.Domain&cDQT&",Name="&cDQT&oGroup.Name&cDQT&cSQT)
		aSplit = split(oGroupUser.PartComponent,cDQT)
		Select Case lcase(split(aSplit(0),":")(1))
			Case "win32_systemaccount.domain="
				oClass.MemberType = "SystemAccount"
			Case "win32_useraccount.domain="
				oClass.MemberType = "UserAccount"
			Case "win32_group.domain="
				oClass.MemberType = "Group"
			Case Else
				oClass.MemberType = "Unknown"
		End Select
		oClass.MemberName = aSplit(3)
		oClass.MemberDomain = aSplit(1)
		oClass.GroupName = oGroup.Name
		oClass.GroupSID = oGroup.SID
		oClass.Put_
	Next
Next

Далее нам потребуется изменить файл sms_def.mof и добавить в него следующие строки:

//**************************************************************************
//* Class: Win32_LocalGroupMember
//**************************************************************************

[ SMS_Report     (TRUE),
  SMS_Group_Name ("Local Group Member"),
  SMS_Class_ID   ("CUSTOM|LocalGroupMember|1.0") ]
class Win32_LocalGroupMember : SMS_Class_Template
{
	[SMS_Report (TRUE), key ] string MemberName;
	[SMS_Report (TRUE)      ] string MemberDomain;
	[SMS_Report (TRUE)      ] string MemberType;
	[SMS_Report (TRUE), key ] string GroupName;
	[SMS_Report (TRUE)      ] string GroupSID;
};

Следующим этапом требуется запустить данный скрипт на клиентах, причем делать это следует регулярно. Желательно скрипт запускать с той же частотой, что и аппаратная инвентаризация. Т.е. если у вас инвентаризация проходит раз в три дня, то и скрипт запускать следует раз в три дня. После этого можно уже построить отчет по группам, указывая не имя, а SID группы. Список SID встроенных групп можно найти здесь — http://support.microsoft.com/kb/243330. Вот самый простой отчет по доменным пользователям, которые входят в группу локальных администраторов:

SELECT SYS.Name0, GroupName0[Local Group Name], MemberDomain0[Member Domain], MemberName0[Member Name], MemberType0[Type]
FROM v_GS_LocalGroupMember0 LGM
INNER JOIN v_R_System SYS on SYS.ResourceID = LGM.ResourceID
WHERE LGM.GroupSID0 = 'S-1-5-32-544' and LGM.MemberDomain0 != SYS.Name0 and LGM.MemberType0 = 'UserAccount'
ORDER by SYS.Name0

UPDATE 27.06.2014: В ConfigMgr 2012 R2 создается таблица в виде v_GS_CUSTOM_LocalGroupMember0, соответственно запрос будет выглядеть так:

SELECT SYS.Name0, GroupName0[Local Group Name], MemberDomain0[Member Domain], MemberName0[Member Name], MemberType0[Type]
FROM v_GS_CUSTOM_LocalGroupMember0 LGM
INNER JOIN v_R_System SYS on SYS.ResourceID = LGM.ResourceID
WHERE LGM.GroupSID0 = 'S-1-5-32-544' and LGM.MemberDomain0 != SYS.Name0 and LGM.MemberType0 = 'UserAccount'
ORDER by SYS.Name0
Реклама

Детали bobgreen84
System Center Products Specialist

5 Responses to RS: Отчет по членству локальных групп

  1. Alex says:

    А можно описать в пару шагах, как построить отчет по вашему посту?

  2. bf says:

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

    • bobgreen84 says:

      Да, данный скрипт отдает локальных пользователей. Вполне возможно, что еще не прошел цикл инвентаризации.

  3. bf says:

    Всё оказалось проще)
    Вот эту статью я нашел гораздо позже https://systemcenter4all.wordpress.com/2014/07/15/cm-local-group-membership/
    Проблема в том что по wmi видно 25 записей на компьютере. А в базе, по запросу ResourceID, показывает что их 11.
    В какую сторону копать?

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: