Установка обновлений на Windows Server 2008 core

31 Октябрь 2011

Что-то надоело мне постоянно искать этот полезный скрипт. Решил его к себе повесить.

запуск:

 cscript WUA_SearchDownloadInstall.vbs

Example

Set updateSession = CreateObject("Microsoft.Update.Session")
Set updateSearcher = updateSession.CreateupdateSearcher()

WScript.Echo "Searching for updates..." & vbCRLF

Set searchResult = _
updateSearcher.Search("IsInstalled=0 and Type='Software'")


WScript.Echo "List of applicable items on the machine:"

For I = 0 To searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    WScript.Echo I + 1 & "> " & update.Title
Next

If searchResult.Updates.Count = 0 Then
    WScript.Echo "There are no applicable updates."
    WScript.Quit
End If

WScript.Echo vbCRLF & "Creating collection of updates to download:"

Set updatesToDownload = CreateObject("Microsoft.Update.UpdateColl")

For I = 0 to searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    WScript.Echo I + 1 & "> adding: " & update.Title
    updatesToDownload.Add(update)
Next

WScript.Echo vbCRLF & "Downloading updates..."

Set downloader = updateSession.CreateUpdateDownloader()
downloader.Updates = updatesToDownload
downloader.Download()

WScript.Echo  vbCRLF & "List of downloaded updates:"

For I = 0 To searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    If update.IsDownloaded Then
       WScript.Echo I + 1 & "> " & update.Title
    End If
Next

Set updatesToInstall = CreateObject("Microsoft.Update.UpdateColl")

WScript.Echo  vbCRLF & _
"Creating collection of downloaded updates to install:"

For I = 0 To searchResult.Updates.Count-1
    set update = searchResult.Updates.Item(I)
    If update.IsDownloaded = true Then
       WScript.Echo I + 1 & "> adding:  " & update.Title
       updatesToInstall.Add(update)
    End If
Next

WScript.Echo  vbCRLF & "Would you like to install updates now? (Y/N)"
strInput = WScript.StdIn.Readline
WScript.Echo

If (strInput = "N" or strInput = "n") Then
    WScript.Quit
ElseIf (strInput = "Y" or strInput = "y") Then
    WScript.Echo "Installing updates..."
    Set installer = updateSession.CreateUpdateInstaller()
    installer.Updates = updatesToInstall
    Set installationResult = installer.Install()
   
    'Output results of install
    WScript.Echo "Installation Result: " & _
    installationResult.ResultCode
    WScript.Echo "Reboot Required: " & _
    installationResult.RebootRequired & vbCRLF
    WScript.Echo "Listing of updates installed " & _
     "and individual installation results:"
   
    For I = 0 to updatesToInstall.Count - 1
        WScript.Echo I + 1 & "> " & _
        updatesToInstall.Item(i).Title & _
        ": " & installationResult.GetUpdateResult(i).ResultCode        
    Next
End If

Ссылка на первоисточник MSDN

Ошибка DistributedCOM с кодом события 10016

7 Октябрь 2011

Обнаружил, что системный лог забит следующими ошибками:

Имя журнала:   System
Источник:      Microsoft-Windows-DistributedCOM
Дата:          07.10.2011 10:12:56
Код события:   10016
Категория задачи:Отсутствует
Уровень:       Ошибка
Ключевые слова:Классический
Пользователь:  система
Компьютер:     TITAN.isea.ru
Описание:
Не удается найти описание для идентификатора события 10016 из источника Microsoft-Windows-DistributedCOM. Вызывающий данное событие компонент не установлен на этом локальном компьютере или поврежден. Установите или восстановите компонент на локальном компьютере.

Если событие возникло на другом компьютере, возможно, потребуется сохранить отображаемые сведения вместе с событием.

К событию были добавлены следующие сведения:

для конкретного приложения
Локальный
Запуск
{24FF4FDC-1D9F-4195-8C79-0DA39248FF48}
{B292921D-AF50-400C-9B75-0C57A7F29BA1}
NT AUTHORITY
система
S-1-5-18
LocalHost (с использованием LRPC)

Порывшись по реестру по id B292921D-AF50-400C-9B75-0C57A7F29BA1 обнаружил, что это проблема с NAP службой. Которую я ни как не настраивал для работы в нашей сети. По второму id 24FF4FDC-1D9F-4195-8C79-0DA39248FF48 я службы не нашел. После непродолжительно поиска в гугле обнаружилось, что это nap client от касперского. Меня раздражают ошибки в логах, по этому на сайте поддержки касперского нашлось решение. Для этого надо через реестр отключить nap от касперского, делается очень просто.
На клиентском компьютере выполните следующее:
Перейдите в раздел реестра:
для 32 bit OC

HKEY_LOCAL_MACHINE\SOFTWARE\KasperskyLab\Components\34\1103\1.0.0.0\

для 64 bit ОС

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\KasperskyLab\Components\34\1103\1.0.0.0\

Создайте раздел NAP;
В разделе NAP создайте DWORD ключ с именем Enable. Присвойте следующие значения:
1 – включить взаимодействие с NAP Agent;
0 – отключить взаимодействие с NAP Agent.
После создания или изменения ключа Enable необходимо перезапустить службу Агента администрирования (Kaspersky Lab Network Agent).
Вот собственно и все. Распространил по всему домену данный ключ с нацеливанием на разные архитектуры по средствам GPP. Так же вот пруфлин на KB на сайте поддержки касперского.

Author: Categories: Работа Tags:

Форсирование скачивания адресной книги при старте Lync client

3 Октябрь 2011

Это памятка больше для себя. Нежели для других.

Заходим на сервер. Удаляем содержимое каталога:

\\lync-01\Shares\1-WebServices-1\ABFiles\00000000-0000-0000-0000-000000000000\00000000-0000-0000-0000-000000000000

Запускаем следующие командлеты в PowerShell:

Update-CsUserDatabase

Ждем появления в логах следующих эвентов с номерами 30024, 30027, 30028 и запускаем еще формирование адресной книги:

Update-CsAddressBook

ждем появления эвента под номером 62020. После этого на клиенской машине, выгружаем клиента lync и добавляем в реестр ключ для скачивания адресной книги при запуске клиента lync:

 reg add HKLM\Software\Policies\Microsoft\Communicator /v GalDownloadInitialDelay /t REG_DWORD /d 0 /f

идем в папку:

%userprofile%\AppData\Local\Microsoft\Communicator\sip_user@sip_domain

и удаляем файл GalContacts.db и GalContacts.db.idx после этого запускаем lync клиент и он подтянет свежею адресную книгу и можно пробовать искать пользователей.

Author: Categories: Работа Tags:

Удаление всех контактов и групп у пользователя Lync

30 Сентябрь 2011

Для выполнения данной операции существует следующая SQL процедура которую можно запустить из SQL Server Management Studio или скрипта.

DECLARE @RC int
DECLARE @_Owner nvarchar(4000)

-- TODO: Set parameter values here.
--set @_Owner="account@company.com"

EXECUTE

@RC = [rtc].[dbo].[ImpDeleteContactGroups2]
   "account@company.com"
GO

Очень удобная вещь если ведется тестирование управления списком контактов.

Как узнать какой версией Exchange была расширена Schema леса вашего домена

12 Апрель 2011

Это делается достаточно просто. Нужно лишь составить запрос для dsquery. Запрос выглядит следующим образом:

dsquery * "CN=ms-Exch-Schema-Version-Pt,CN=Schema,CN=Configuration,DC=isea,DC=ru" -scope base -attr rangeupper

После выполнения данного запрос в cmd появится числовое значение, в моем случаи это 14726. Это говорит, что я расширил схему с дистрибутива Exchange 2010 SP1. А вот примерная табличка по версиям:
Exchange 2007 sp1, for which the ms-Exch-Schema-Version-Pt attribute at rangeUpper = 11116
Exchange 2007 sp2,for which the ms-Exch-Schema-Version-Pt attribute at rangeUpper = 14622
Exchange 2010 RTM, for which the ms-Exch-Schema-Version-Pt attribute at rangeUpper = 14622
Exchange 2010 SP1, for which the ms-Exch-Schema-Version-Pt attribute at rangeUpper = 14726

Author: Categories: Работа Tags:

Удаление данных из Active Directory после неудачного понижения роли контроллера домена

8 Апрель 2011

Краткая памятка как производить удаление вышедшего из строя DC. А то зачастили ко мне обращаться с данными просьбами.
Запустить cmd
01. ntdsutil
02. metadata cleanup
03. connections
04. connect to server (где имя функционирующего DC. Это необходимо сделать на ОС младше Windows Server 2003 SP1)
05. quit
06. select operations target
07. lists sites
08. select site <#> (где <#> номер сайта где у нас находится вышедший из строя DC)
09. list servers in site
10. select server <#> (где <#> номер DC вышедшего из строя)
11. list domains
12. select domain <#> (где <#> номер домена в котором расположен вышедший из строя DC)
13. quit (возвращаемся обратно в меню metadata cleanup)
14. remove selected server (появится окошко предупреждающее нас.)
15. нажимаем Yes

Вот все действия которые необходимо сделать в ntdsutil. Дальше воспользуемся оснастками управления.
В Active Directory Sites and Services удаляем наш сервер и проверяем, что он больше к какому из функционирующих DC не подключен.
В Active Directory Users and Computers удаляем объект компьютера ненадлежащего нашему DC который вышел из строя.
В DNS Manager Удаляем все записи вида ns, a, ptr относящиеся к нашему DC
————————-
Вот собственно и все. Эта заметка я думаю исключительно для меня. Чтоб не забыть.

Author: Categories: Работа Tags:

Удаление всех таблиц в базе mysql

6 Апрель 2011

Необходимо развернуть сайт, но в базе под сайт уже куча таблиц и их надо удалить. Делать это вручную, значит себя не уважать. По этому появилась вот такая замечательная строчка для консоли:

mysqldump -p --add-drop-table --no-data database_name | grep ^DROP  | mysql -p database_name

Расшифровка названий файлов логов sccm 2007

Кто уже пробует у себя на предприятии развернуть sccm 2007 или уже использующий его могли заметить, что он создает большой объем log файлов с достаточно тяжелыми названиями. А если к этому еще добавить клинские log файлы. То в голове образуется каша. В группе по sccm проскочил линк где как раз дается расшифровка этих логов, для чего они нужны и за что отвечают. Собственно вот пруфлинк. Ну и на всякий случай дубль у меня на странице.
Читать далее…

Author: Categories: Работа Tags:

Файл ответов для настройки контроллера домена на Windows Server 2008 Core

24 Сентябрь 2010

Что-то надоело каждый раз искать синтаксис для файла ответов по настройке контроллера домена на Core и не только серверах. С графическим интерфейсом все можно сделать вручную не особо напрягаясь. А вот в на core серверах приходится использовать данный файл. Ниже приложен шаблон для файла добавочного контроллера доменов. То есть того второго и последующего КД.

[DCINSTALL]
UserName=<username>
UserDomain=<domain>
Password=<password>
SiteName=<site name>
ReplicaOrNewDomain=Replica
DatabasePath="%systemroot%\NTDS"
LogPath="%systemroot%\NTDS"
SYSVOLPath="%systemroot%\SYSVOL"
InstallDNS=yes
ConfirmGC=yes
SafeModeAdminPassword=<password>
ReplicaDomainDNSName=<domain>
RebootOnCompletion=no

Тут я попробую кратно расписать для чего нужны некоторые поля:
UserName – пользователь под которым будет происходить развертывание КД
UserDomain – домен пользователя под которым разворачиваем КД
SiteName – имя сайта в котором будем разворачивать КД
ReplicaOrNewDomain – указываем тип КД, Replica говорит, что это будет добавочный КД
InstallDNS – уставить ли DNS сервер
ConfirmGC – будет ли он сразу глобальным каталогом
SafeModeAdminPassword – пароль для DSRM, при чем после использования файла ответов это поле очищается
ReplicaDomainDNSName – имя домена в который добавляем КД
RebootOnCompletion – необходимо ли перезагружать сервер после развертывания роли

Использовать вот так:

dcpromo /unattend:ReplicaDCCreate.txt

ToDo: Позже добавлю файл для установки первого КД в сети и удаления КД.

Author: Categories: Работа Tags: ,

Ищем папки куда у нас нету доступа

4 Февраль 2010

Продолжаю выполнение чужих просьб :) В этот раз попросили сделать следующее. Есть файловый сервер и на нем бордак с правами и наследование отсутствует. Нужно найти все папки где в пермишенах нету определенной группы/пользователя. Во время написания скрипта обнаружилось две проблемы. Первая заключалась в том, что нашлись папки куда у администратора вообще доступа не было. Так же нашлись папки с путем больше 256 символов. По этому был добавлен обработчик ошибок который проблемные папки выводит в два файлика для дальнейшего разбирательства. Вот собственно и сама функция:

Function Get-NotPermissions ($path,$group,$error_rights,$error_long) {
#--- очищаем лог ошибок
    $error.Clear |out-null
#--- рекурсивно перебираем все папки
    foreach ($item in Get-ChildItem -LiteralPath $path -Recurse -Force -ErrorAction  SilentlyContinue -ErrorVariable error_mass | Where-Object {$_.PSIsContainer}) {
#--- создаем массив с разрешениями
        $groups = ($item.PSPath |get-acl).Access | select -expandproperty IdentityReference
#--- проверяем есть ли в массиве интересующая нас группа
        if ($groups -notcontains $group) { '"'+$item.fullname+'"'}
    }
   
#--- проверяем существует ли файл и если чего удаляем его
    if (Test-Path $error_rights) {Remove-Item -Path $error_rights -Force -Confirm}
    if (Test-Path $error_long) {Remove-Item -Path $error_long -Force -Confirm}
   
#--- обрабатываем полученные ошибки
    foreach ($item in $error_mass ) {
#--- нету доступа
        if ($item.CategoryInfo.Reason -eq 'UnauthorizedAccessException') {
            '"' + $item.TargetObject + '"'  |Out-File -Encoding 'Unicode' -FilePath $error_rights -Append
        }
#--- длинный путь, больше 256 символов
        elseif ($item.CategoryInfo.Reason -eq 'PathTooLongException') {
            '"' + $item.TargetObject + '"'  |Out-File -Encoding 'Unicode' -FilePath $error_long -Append
        }
    }
}

Ну и конечно пример запуска:

Get-NotPermissions -path '\\titan\C$\Bin\tmp' -group 'isea\abigor' -error_rights 'D:\error_NTFS.txt' -error_long 'D:\error_long_NTFS.txt'