Description log files SCCM 2007
29 мая 2009 г.Список и описание всех логов которые ведет SCCM 2007 на TechNet
Пример внедрения ILM 2007
В предыдущих постах я описывал как связать разные службы каталогов при помощи ILM 2007. Здесь я объединю все заметки этой теме воедино.
Что из себя представляет ILM (Microsoft Identity Lifecycle Manager)? Состоит он из основных компонентов:
- Connected data source (подключаемые источники данных);
- Management Agents (агенты управления);
- Сonnector Spaces (пространства подключения);
- Metaverse (Метабаза).
и основные функции ILM:
- синхронизация каталогов;
- управление паролями и их синхронизация;
- управление группами;
- инициализация учетных записей;
- публикация сертификатов.
Run management agent ILM 2007
28 мая 2009 г.Мы настроили ILM 2007 для синхронизации AD c eDirectory и Sun ONE Directory. Теперь постала задача регулярно выполнять MA (management agent).
Вариант 1
Создать скрипт для каждого профиля агента.
Получим следующий скрипт:
Const PktPrivacy = 6rem Const wbemAuthenticationLevelPkt = 6Set Locator = CreateObject("WbemScripting.SWbemLocator")remrem Credentials must only be specified when Microsoft Identity Integration Server is on remote system.remrem Locator.Security_.AuthenticationLevel = wbemAuthenticationLevelPktrem Set Service = Locator.ConnectServer("MyServer", "root/MicrosoftIdentityIntegrationServer")rem Set Service = Locator.ConnectServer("MyServer", "root/MicrosoftIdentityIntegrationServer", "Domain\Me", "MyPassword")remSet Service = GetObject("winmgmts:{authenticationLevel=PktPrivacy}!root/MicrosoftIdentityIntegrationServer")Set MASet = Service.ExecQuery("select * from MIIS_ManagementAgent where Guid = '{12B4583D-C2D8-43A1-BF48-28651247DE41}'")for each MA in MASetWScript.Echo "Running " + MA.name + ".Execute(""Full Import-Full Synchronization"")..."WScript.Echo "Run completed with result: " + MA.Execute("Full Import-Full Synchronization")next
Объединив все профили всех МА в один скрипт.
Вариант 2
Воспользоваться утилитой MASequencer.exe из MIIS 2003 Resource Tool Kit, предварительно создав XML конфиг утилитой MAConfigurationViewer.exe
и запускать MASequencer.exe с параметром /F:<имя конфига>
Вариант 3
создать 2-ва скрипта. Сами скрипты взяты с примеров у Microsoft
MA-Runs.cmd:
@echo offremrem Copyright (c) Microsoft Corporation. All rights reserved.remsetlocalset zworkdir=%~dp0pushd %zworkdir%cscript runMA.vbs /m:"MA_Active_Directory" /p:"Full Import-Full Synchronization"if {%errorlevel%} NEQ {0} (echo Error[%errorlevel%]: command file failed) & (goto exit_script)cscript runMA.vbs /m:"MA_Sun" /p:"Full Import-Full Synchronization"if {%errorlevel%} NEQ {0} (echo Error[%errorlevel%]: command file failed) & (goto exit_script)cscript runMA.vbs /m:"MA_Novell" /p:"Full Import-Full Synchronization"if {%errorlevel%} NEQ {0} (echo Error[%errorlevel%]: command file failed) & (goto exit_script)cscript runMA.vbs /m:"MA_Active_Directory" /p:"Export"if {%errorlevel%} NEQ {0} (echo Error[%errorlevel%]: command file failed) & (goto exit_script)cscript runMA.vbs /m:"MA_Sun" /p:"Export"if {%errorlevel%} NEQ {0} (echo Error[%errorlevel%]: command file failed) & (goto exit_script)cscript runMA.vbs /m:"MA_Novell" /p:"Export"if {%errorlevel%} NEQ {0} (echo Error[%errorlevel%]: command file failed) & (goto exit_script):exit_scriptpopdendlocal
runMA.vbs:
option expliciton error resume next'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-='SCRIPT: runMA.vbs'DATE: 2003-02-05'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-='= Copyright (C) 2003 Microsoft Corporation. All rights reserved.'='******************************************************************************'* Function: DisplayUsage'*'* Purpose: Displays the usage of the script and exits ths script'*'******************************************************************************Sub DisplayUsage()WScript.Echo ""WScript.Echo "Usage: runMa </m:ma-name> </p:profile-name>"WScript.Echo " [/s:mms-server-name]"WScript.Echo " [/u:user-name]"WScript.Echo " [/a:password]"WScript.Echo " [/v] Switch on Verbose mode"WScript.Echo " [/?] Show the Usage of the script"WScript.Echo ""WScript.Echo "Example 1: runMa /m:adma1 /p:fullimport"WScript.Echo "Example 2: runMa /m:adma1 /p:fullimport /u:domain\user /a:mysecret /v"WScript.Quit (-1)End Sub'******************************************************************************' Script Main Execution Starts Here'******************************************************************************'--Used Variables--------------------------dim sdim runResultdim rescodedim managementagentNamedim profiledim verbosemodedim wmiLocatordim wmiServicedim managementagentdim serverdim usernamedim password'-----------------------------------------rescode = ParamExists("/?")if rescode = true then call DisplayUsageverbosemode = ParamExists("/v")managementagentName = ParamValue("/m")if managementagentName = "" then call DisplayUsageprofile = ParamValue("/p")if profile = "" then call DisplayUsageif verbosemode then wscript.echo "%Info: Management Agent and Profile is <"& managementagentName &":"& profile &">"if verbosemode then wscript.Echo "%Info: Getting WMI Locator object"set wmiLocator = CreateObject("WbemScripting.SWbemLocator")if err.number <> 0 thenwscript.echo "%Error: Cannot get WMI Locator object"wscript.quit(-1)end ifserver = ParamValue("/s")password = ParamValue("/a")username = ParamValue("/u")if server = "" then server = "." ' connect to WMI on local machineif verbosemode thenwscript.Echo "%Info: Connecting to MMS WMI Service on <" & server &">"if username <> "" then wscript.Echo "%Info: Accessing MMS WMI Service as <"& username &">"end ifif username = "" thenset wmiService = wmiLocator.ConnectServer(server, "root/MicrosoftIdentityIntegrationServer")elseset wmiService = wmiLocator.ConnectServer(server, "root/MicrosoftIdentityIntegrationServer", username, password)end ifif err.number <> 0 thenwscript.echo "%Error: Cannot connect to MMS WMI Service <" & err.Description & ">"wscript.quit(-1)end ifif verbosemode then wscript.Echo "%Info: Getting MMS Management Agent via WMI"Set managementagent = wmiService.Get( "MIIS_ManagementAgent.Name='" & managementagentName & "'")if err.number <> 0 thenwscript.echo "%Error: Cannot get Management Agent with specified WMI Service <" & err.Description & ">"wscript.quit(-1)end ifwscript.echo "%Info: Starting Management Agent with Profile <"& managementagent.name &":"& profile &">"runResult = managementagent.Execute(profile)if err.number <> 0 thenwscript.Echo "%Error: Running MA <"& err.Description & ">. Make sure the correct profile name is specified."wscript.quit(-1)end ifwscript.Echo "%Info: Finish Running Management Agent"wscript.Echo "%Result: <" & CStr(runResult) & ">"wscript.quit(0)'******************************************************************************'* Function: ParamValue'*'* Purpose: Parses the command line for an argument and'* returns the value of the argument to the caller'* Argument and value must be seperated by a colon'*'* Arguments:'* [in] parametername name of the paramenter'*'* Returns:'* STRING Parameter found in commandline'* "" Parameter NOT found in commandline'*'******************************************************************************Function ParamValue(ParameterName)Dim i '* CounterDim Arguments '* Arguments from the command-line commandDim NumberofArguments '* Number of arguments from the command-line commandDim ArgumentArray '* Array in which to store the arguments from the command-lineDim TemporaryString '* Utility string'* Initialize Return Value to e the Empty StringParamValue = ""'* If no ParameterName is passed into the function exitif ParameterName = "" then exit function'* Check if Parameter is in the Arguments and return the valueSet Arguments = WScript.ArgumentsNumberofArguments = Arguments.Count - 1For i=0 to NumberofArgumentsTemporaryString = Arguments(i)ArgumentArray = Split(TemporaryString,":",-1,vbTextCompare)If ArgumentArray(0) = ParameterName ThenParamValue = ArgumentArray(1)exit functionEnd IfNextend Function'******************************************************************************'* Function: ParamExists'*'* Purpose: Parses the command line for an argument and'* returns the true if argument is present'*'* Arguments:'* [in] parametername name of the paramenter'*'* Returns:'* true Parameter found in commandline'* false Parameter NOT found in commandline'*'******************************************************************************Function ParamExists(ParameterName)Dim i '* CounterDim Arguments '* Arguments from the command-line commandDim NumberofArguments '* Number of arguments from the command-line commandDim ArgumentArray '* Array in which to store the arguments from the command-lineDim TemporaryString '* Utility string'* Initialize Return Value to e the Empty StringParamExists = false'* If no ParameterName is passed into the function exitif ParameterName = "" then exit function'* Check if Parameter is in the Arguments and return the valueSet Arguments = WScript.ArgumentsNumberofArguments = Arguments.Count - 1For i=0 to NumberofArgumentsTemporaryString = Arguments(i)If TemporaryString = ParameterName ThenParamExists = trueexit functionEnd IfNextend Function
И запускаем MA-Runs.cmd
Какой бы вариант мы не выбрали, нужно создать scheduled job и запускать от имени пользователя являющимся членом группы MIISOperators
Windows 2008 & Vista Hibernation
27 мая 2009 г.Зачем Hibernation в гостевой ОС? Я тоже думаю что ни к чему ;) И если учитывать что в нашей виртуальной среде есть сервера в которых размер системного диска не превышает 40 GB и каждый гигабайт на особом счету ;). Конечно если у Вас системный диск 100 GB, то и переживать не нужно. А мы отключим Hibernate в командной строке выполнив:
powercfg –h off
Освободим дисковое пространство ;)
Restore deleted objects in AD
Были случаи когда Вы случайно удалили пользователя из Active Directory? :) Лично у меня да. Создавать новую учетную запись вариант не самый лучший. Мы попробуем ее восстановить. Нам понадобится ldp.exe из Windows Support Tools и немного знаний об объектах “Tombstone Objects”.
Что же происходит в AD когда мы удаляем объект? На самом беле объект не удаляется сразу, а перемещается в контейнер “Deleted Objects”. При этом у него меняется значение атрибута “distinguishedName” – после имени появляется флаг 0ADEL, появляется атрибут “isDeleted” значения которого True или False говорят о том что объект помечен на удаление, и в атрибут “whenChanged” проставляется время удаления объекта. После этого по контейнеру “Deleted Objects” проходится так называемый “Garbage Collector” (сборщик мусора) и проверяет не наступило ли время захоронения объекта. И если это так - то объект удалится навсегда. Время захоронения в днях определяется атрибутом “tombstoneLifetime” объекта “CN=Directory Service, CN=Windows NT, CN=Services, CN=Configuration, DC=ForestRoot Domain Name” по умолчания он принимает значение:
- 180 дней если контролер домена расположен на Windows Server 2003 с Service Pack 1 (SP1), Windows Server 2003 с Service Pack 2 (SP2), Windows Server 2008, Windows Server 2008 R2
- 60 дней если контролер домена расположен на Windows 2000 Server, Windows Server 2003, Windows Server 2003 R2
И так присоединяемся к контролеру домена используя утилиту ldp.exe. Чтобы нам увидеть контейнер “Deleted Objects” делаем следующие:
- в меню Options выбираем команду Controls
- окне в поле Load Predefined из ниспадающего списка выбираем Return deleted objects
Затем окне Tree view в поле BaseDN выбираем корень леса и ищем контейнер CN=Deleted Objects, находи объект который мы хоти восстановить.
Теперь самое интересное:
Правым кликом вызываем контекстное меню, выбираем в нем пункт Modify.
- в разделе Edit Entry, в поле Attribute вводим “isDeleted”, в панели Operation выбираем Delete, затем жмем Enter.
- в разделе Edit Entry, в поле Attribute вводим имя атрибута “distiguishedName” в поле Values вводим значение атрибута “CN” который был до удаления плюс значение атрибута “lastKnownParent”
- в разделе Operation, выбираем – Replace, жмем Enter
- выбираем флаги Synchronous и Extended нажимаем кнопку Run
Вызываем оснастку dsa.msc, переходив в контейнер который был указан в атрибуте “lastKnownParent”. Включаем учетную запись и получаем сообщение:
Значит нужно изменить сначала пароль, а затем включить учетную запись.
Материалы по восстановлению объектов в AD можно почитать на TechNet MSDN
Отображение имени пользователя в сетевом окружении.
После того как при помощи скриптов мы меняем атрибут Description компьютера в AD описанного в этом посте, захотелось аналогично проставлять Description в "My Computer"-> “Properties” -> "Computer Name". Вот он скрипт, взят с здесь
On Error Resume NextSet WSHNetwork = CreateObject("WScript.Network")Path = WSHNetwork.UserNameSet objSysInfo = CreateObject("ADSystemInfo")strUserDN = objSysInfo.UserNameSet objUser = GetObject("LDAP://" & strUserDN)Set objWMIService = GetObject("winmgmts:")Set colSoftware = objWMIService.ExecQuery _("Select * FROM Win32_Service WHERE Name ='Lanmanserver'" )For Each objSoftware in colSoftwareobjSoftware.StopService()NextSet WSHShell = WScript.CreateObject("WScript.Shell")Set WshNetwork = CreateObject("WScript.Network")WSHShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters\srvcomment", objUser.DisplayNameSet objWMIService = GetObject("winmgmts:")Set colSoftware = objWMIService.ExecQuery _("Select * FROM Win32_Service WHERE Name ='Lanmanserver'" )For Each objSoftware in colSoftwareobjSoftware.StartService()Next
SP2 for Windows Server 2008 and Windows Vista
26 мая 2009 г.Сегодня на сайте Microsoft стал доступен SP2 (KB948465) для Windows Server 2008 и Windows Vista. SP2 поддерживает пока только English, German, French, Japanese, Spanish языки.
Подробней о пакет обновления на Technet для Windows Vista Windows Server 2008
Сам пакет обновления 2 x86 IA64 x64 , доступны они так же и через WSUS.
Script add description of Сomputer
Попались на глаза интересные скрипты, которые добавляют к атрибуту Description объекта (объекта-компьютера в AD) имени текущего залогиненого пользователя. Два скрипта прописываются в групповую политику Logon и Logoff соответственно, и делегируются полномочия пользователь на атрибут Description в OU находятся клиентские компьютеры. Скрипты и как это выглядит взяты отсюда
Скрипт Logon:
On Error Resume NextDim adsinfo, ThisComp, oUserSet adsinfo = CreateObject("adsysteminfo")Set ThisComp = GetObject("LDAP://" & adsinfo.ComputerName)Set oUser = GetObject("LDAP://" & adsinfo.UserName)Thiscomp.put "description", "Logged on: " + oUser.cn + " " + CStr(Now)ThisComp.Setinfo
Скрипт Logoff :
On Error Resume NextDim adsinfo, ThisComp, oUserSet adsinfo = CreateObject("adsysteminfo")Set ThisComp = GetObject("LDAP://" & adsinfo.ComputerName)Set oUser = GetObject("LDAP://" & adsinfo.UserName)Thiscomp.put "description", "Logged on: " + oUser.cn + " " + CStr(Now)ThisComp.Setinfo
Делегирование:
Делегирование будем выполнять только для клиентских компьютеров!
- Right-click the OU/container where computer accounts reside and choose "Delegate Permissions".
- Click "Next" and in the next dialog add "Domain Users" group. In the next dialog select "Create a custom task to delegate".
- Select "only the following objects in the folder" and check "computer objects" in the listbox. Click Next.
- In the next dialog make sure only "Property specific" is checked under "Show these permissions".
- Check "Write description".
- Next and Finish.
Clear history MA MISS and ILM 2007
После настройки ILM 2007, нужно периодически очищать историю выполнения MA (агента управления). Вся история хранятся в базе данных, и логично чем больше записей - больше база ILM.
Мы воспользуемся утилитой miisclearrunhistory.exe из MIIS 2003 Resource Tool Kit для очистки истории.
miisclearrunhistory.exe /pr: <кол-во дней > /y
Создаем пользователя и включаем в группу MIISOperators, от его имени будем запускать scheduled job и пусть выполняется ночью.
SCOM 2007 R2 Documentation
24 мая 2009 г.С выходом SCOM 2007 R2 появилась документация, которая поможет разобраться с планированием, внедрением, управлением Operations Manager 2007 R2.
PostFix & Dynamic Group
22 мая 2009 г.После настройки почтовика описанного в этом посте, стало возможным осуществить “старую мечту” :) – рассылку сообщений ВСЕМ пользователям. Для этого нужно:
- создать в Sun Directory группу, прописать в атрибуте “mail” – электронный адрес для группы и в атрибуте “memberurl” следующий запрос:
ldap:///dc=dn,dc=local??sub?(&(objectclass=person)(mail=*)(!(nsAccountLock=true)))
запрос будет выбирать пользователей у которых присутствует атрибут “mail” и учетная запись не отключена
2. подправим наш ldap-groups-sun.cf добавив к переменой special_result_attribute memberurl и получился конфиг:
server_host = sunldap.dn.localsearch_base = ou=People,dc=dn,dc=localversion = 3query_filter = (&(objectclass=groupOfUniqueNames)(|(mailAlternateAddress=%s)(mail=%s)))leaf_result_attribute = mailresult_attribute = mailspecial_result_attribute = uniqueMember, memberurlbind = yesbind_dn = uid=ldap,dc=dn,dc=localbind_pw = password
Ну и конечно в Postfix с помощью restriction_classes ограничить доступ на этот адрес.
Postfix-Dovecot-Sun Direcory Server
21 мая 2009 г.Была поставлена задача создать почтовую систему и связать ее с Active Directory, но если служба каталогов не будет доступна по какой-то причине, пользователям не будет доставляться почта. И мы решили развернуть еще одну службу каталогов. Выбор остановили на SUN ONE Directory Server. Он бесплатный, документация отличная и что немало важно управлять ним можно через WEB или java консоль, а синхронизировать Active Direcory и Sun Direcory мы будем с помощью ILM 2007 (Microsoft Identity Lifecycle Manager).
Script StartUP Sun ONE Directory Server
20 мая 2009 г.Тут пример скрипта для старта-рестарта-стопа Sun ONE Directory Server 5.2 (у меня такой). Создаем в /etc/init.d файл sun-dir следующего содержания:
#!/bin/sh# chkconfig: - 80 80# description: This script is used as a startup script.# processname: start-sun-dirNETSITE_ROOT=/opt/sunfinal_exit_code=0case "$1" instart)# start Directory Server$NETSITE_ROOT/slapd-sunldap/start-slapd 2>&1# start Administration Server$NETSITE_ROOT/start-admin 2>&1exit ${final_exit_code};;stop)# stop Directory Server$NETSITE_ROOT/slapd-sunldap/stop-slapd 2>&1# stop Administration Server$NETSITE_ROOT/stop-admin 2>&1exit ${final_exit_code};;restart)# stop Directory Server$NETSITE_ROOT/slapd-sunldap/stop-slapd 2>&1# stop Administration Server$NETSITE_ROOT/stop-admin 2>&1# start Administration Server$NETSITE_ROOT/start-admin 2>&1# start Directory Server$NETSITE_ROOT/slapd-sunldap/start-slapd 2>&1exit ${final_exit_code};;*)if [ -z $1 ]thenecho "Usage: $0 {start|stop|restart}" >&2fiexit 1;;esac
правим пути и выполняем chkconfig sun-dir on
Все…, теперь наш Sun ONE Directory Server будет корректно стартовать при старте ОС