Что-то надоело мне постоянно искать этот полезный скрипт. Решил его к себе повесить.
запуск:
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
Обнаружил, что системный лог забит следующими ошибками:
Имя журнала: 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 на сайте поддержки касперского.
Это памятка больше для себя. Нежели для других.
Заходим на сервер. Удаляем содержимое каталога:
\\lync-01\Shares\1-WebServices-1\ABFiles\00000000-0000-0000-0000-000000000000\00000000-0000-0000-0000-000000000000
Запускаем следующие командлеты в PowerShell:
Ждем появления в логах следующих эвентов с номерами 30024, 30027, 30028 и запускаем еще формирование адресной книги:
ждем появления эвента под номером 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 клиент и он подтянет свежею адресную книгу и можно пробовать искать пользователей.
Для выполнения данной операции существует следующая 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
Очень удобная вещь если ведется тестирование управления списком контактов.
Это делается достаточно просто. Нужно лишь составить запрос для 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
Краткая памятка как производить удаление вышедшего из строя 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
————————-
Вот собственно и все. Эта заметка я думаю исключительно для меня. Чтоб не забыть.
Необходимо развернуть сайт, но в базе под сайт уже куча таблиц и их надо удалить. Делать это вручную, значит себя не уважать. По этому появилась вот такая замечательная строчка для консоли:
mysqldump -p --add-drop-table --no-data database_name | grep ^DROP | mysql -p database_name
Кто уже пробует у себя на предприятии развернуть sccm 2007 или уже использующий его могли заметить, что он создает большой объем log файлов с достаточно тяжелыми названиями. А если к этому еще добавить клинские log файлы. То в голове образуется каша. В группе по sccm проскочил линк где как раз дается расшифровка этих логов, для чего они нужны и за что отвечают. Собственно вот пруфлинк. Ну и на всякий случай дубль у меня на странице.
Читать далее…
Что-то надоело каждый раз искать синтаксис для файла ответов по настройке контроллера домена на 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: Позже добавлю файл для установки первого КД в сети и удаления КД.
Продолжаю выполнение чужих просьб
В этот раз попросили сделать следующее. Есть файловый сервер и на нем бордак с правами и наследование отсутствует. Нужно найти все папки где в пермишенах нету определенной группы/пользователя. Во время написания скрипта обнаружилось две проблемы. Первая заключалась в том, что нашлись папки куда у администратора вообще доступа не было. Так же нашлись папки с путем больше 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'