вторник, 25 ноября 2014 г.

Решение проблемы с неработающим исполняющим ядром "VBScript" в ОС Windows

Если при запуске vbs-скрипта система вам показывает следующую ошибку:"Не удается найти исполняющего ядра "VBScript" для сценария...", необходимо открыть консоль "cmd" и выполнить там следующую команду: "regsvr32 vbscript.dll". Не сработает при отсутствии самой библиотеки "vbscript.dll" на вашем системном диске.


Причиной поломки могут стать некорректно работающие системные утилиты или антивирусное ПО.

понедельник, 24 ноября 2014 г.

VBScript: запуск cmd-скриптов со скрытием окна консоли при выполнении

Данное решение поможет вам в том случае, когда необходимо автоматически выполнить cmd-скрипт, но при этом пользователь не должен иметь возможность закрыть окно консоли во время его работы, таким образом прервав выполнение.

Создайте vbs-скрипт в той же директории со следующей единственной командой:

CreateObject("Wscript.Shell").Run "my_script.cmd", 0, True

где my_script.cmd - имя командного файла для выполнения.

понедельник, 17 ноября 2014 г.

Отключение отчётов об ошибках в Windows Vista, 7, 8 и т.д.

В случае непредвиденных действий со стороны прикладного ПО, операционная система предложит вам решить проблему, отправив отчёт о ней в Microsoft. Если данный функционал вам не нужен и просто надоедает, его можно отключить:

1. Откройте "Панель управления\Система и безопасность\Центр поддержки" (для Vista/2008:"Панель управления\Система и её обслуживание\Отчёты о проблемах и их решениях").


2. Кликните на "Обслуживание", далее "Параметры".
3. Установите переключатель в положение "Не проверять на наличие новых решений".


4. Нажмите "Ок" и закройте "Центр поддержки".

Эту настройку можно сделать и с помощью групповых политик. Находится она по следующему пути: "Конфигурация пользователя или компьютера\Административные шаблоны\Компоненты Windows\Отчеты об ошибках Windows". Для применения просто включите политику с соответствующим названием - "Отключить отчеты об ошибках Windows".

четверг, 13 ноября 2014 г.

Установка OEM версии Microsoft Windows на виртуальную машину VMware

Часто производители серверов поставляют в комплекте с оборудованием OEM версии операционной системы Windows, которые привязаны непосредственно к "железу". При попытке установить такую ОС на виртуальную машину VMware мы получим ошибку:


Если виртуальная машина находится на самом сервере с которым поставлялась данная копия Windows, то нам поможет параметр "smbios.ReflectHost".

Для VMware vSphere ESXi:
Заходим в свойства виртуальной машины "Edit Settings...". Затем "Options/General" и жмем "Configuration Parameters...". Добавляем новый параметр "smbios.ReflectHost" и присваиваем значение "true".

Для VMware Workstation:
При выключенной гостевой машине просто добавьте в конец .vmx файла параметр:
SMBIOS.reflectHost = "TRUE"

Теперь установка OEM версии Microsoft Windows должна будет пройти корректно.

Установка .NET Framework 3.5 на Windows 8/2012 и выше через прокси

Данная инструкция подойдет вам в том случае, когда компьютер с ОС Windows 8/2012 и выше не имеет прямого доступа в интернет. Непосредственно перед установкой .NET Framework 3.5 проделываем следующие шаги:

1. Настраиваем прокси сервер (с поддержкой HTTP/HTTPS) в "Internet Explorer".
2. Запускаем "cmd" от Администратора и устанавливаем прокси для системного пользователя: "netsh winhttp import proxy source=ie"
3. Проверяем групповую политику (gpedit.msc):
"Конфигурация компьютера/Административные шаблоны/Система/Укажите параметр для установки необязательных компонентов и восстановления компонентов". Она должна быть или не настроена или включена с установленной галкой: "Для загрузки содержимого для восстановления перейдите непосредственно в центр обновления Windows вместо служб обновления WSUS". Если пришлось править доменную политику - перезагрузите компьютер.
4. Выполняем:
"dism /Online /Enable-Feature /FeatureName:NetFx3 /All"
или производим установку через GUI.
5. По окончанию не забываем удалить сделанные настройки прокси в "Internet Explorer" и в системе командой:
"netsh winhttp reset proxy"

вторник, 11 ноября 2014 г.

Настройка анонимного общего доступа к папке в домене Active Directory

В некоторых случаях появляется необходимость предоставить компьютерам рабочей группы доступ к определенным открытым папкам в домене. Чтобы настроить анонимный доступ к серверу, являющемуся членом Active Directory, выполните следующие пункты на самом сервере:

1. Включить на сервере учетную запись Гостя("Guest"), если вдруг она оказалась отключённой. Кроме того проверьте, чтобы Локальные политики =>> Параметры безопасности =>> Учетные записи: состояние учетной записи "Гость" не было отключено.
2. На папку, к которой требуется открыть общий доступ, необходимо дать права локальной группе "Все" ("Everyone") на чтение или изменение и на саму файловую систему NTFS.
3. Установить следующие локальные политики на сервере(либо групповые политики домена, применяемые к нему):

"Локальные политики=>>Параметры безопасности=>>Сетевой доступ: не разрешать перечисление учетных записей SAM и общих ресурсов анонимными пользователями" в положение "Отключён";

"Локальные политики=>>Параметры безопасности=>>Сетевой доступ: разрешать применение разрешений "Для всех" к анонимным пользователям" в положение "Включён";

Для повышения безопасности также желательно перейти в "Локальные политики=>>Назначение прав пользователя=>>Запретить локальный вход" и добавить в этот параметр пользователя "Гость".

4. Проверьте параметры:
"Локальные политики=>>Назначение прав пользователя=>>Доступ к компьютеру из сети" - в списке должен обязательно быть пользователь "Гость";
"Локальные политики=>>Назначение прав пользователя=>>Отказать в доступе к этому компьютеру из сети" - а в этом списке пользователя "Гость" не должно быть! Если этот параметр не определён, активируйте его и оставьте список пустым!

После вышеописанных действий анонимные пользователи смогут подключаться к общим папкам данного сервера.

понедельник, 10 ноября 2014 г.

Отсутствует вкладка "Безопасность" в окне "Свойства" файлов и папок в Windows XP

По умолчанию на компьютерах с Windows XP, которые находятся в рабочей группе, в свойствах файлов и папок отсутствует вкладка "Безопасность".


Чтобы включить данную вкладку, необходимо прежде всего убедится в том, что раздел диска отформатирован в файловой системе NTFS. Затем откройте "Свойства папки" и снимите галку "Использовать простой общий доступ к файлам".


После подтверждения настройки вкладка "Безопасность" станет доступной.


пятница, 31 октября 2014 г.

Настройка контроллера домена Windows 2003-2008 для работы с PowerShell модулем ActiveDirectory

Начиная с Windows 7 появилась возможность использовать модуль PowerShell под названием ActiveDirectory для администрирования домена начиная с Windows 2008 R2 и выше. Но что делать, если ваш домен уровня Windows 2003 или 2008? Чтобы решить эту проблему Microsoft разработала службу Active Directory Management Gateway Service (Active Directory Web Service for Windows Server 2003 and Windows Server 2008).

Устанавливается и настраивается следующим образом:
1. Обязательно должен быть установлен Microsoft .NET Framework 3.5 Service Pack 1.
2. Ставим хот фикс KB969166 для .NET 3.5.
3. Далее KB969429 для Windows 2003 или KB967574 для Windows 2008 соответственно.
4. Для Windows 2003 также устанавливаем KB2478953.
5. Теперь инсталлируем Active Directory Management Gateway Service.
6. После завершения установки необходимо проверить, чтобы служба "Active Directory Web Service" появилась в системе и была запущена.
7. На клиентах, которые должны быть не ниже Windows 7, устанавливаем "Средства удаленного администрирования сервера(RSAT)" и не забываем включить в компонентах "Модуль Active Directory для Windows PowerShell".


После вышеперечисленных действий на клиентском компьютере запускаем консоль PowerShell и командой "Import-Module ActiveDirectory" подключаем наш модуль для администрирования домена.


четверг, 30 октября 2014 г.

HTA-приложение с GUI интерфейсом для управления параметром "netbootGUID" компьютерных аккаунтов Active Directory

Данное приложение позволит с удобством управлять шестнадцатеричным параметром "netbootGUID", который связывает аккаунт компьютера в Active Directory с MAC адресом сетевого интерфейса машины.


Кнопка "Search computers" выполняет поиск компьютерных аккаунтов в текущем домене. Также при поиске рекомендуется пользоваться фильтром "Computer name filter" для более быстрого нахождения нужных машин.
Чтобы назначить MAC адрес выбранному аккаунту, введите значение в поле "Computer MAC address" и нажмите "Set MAC address", чтобы очистить параметр, оставьте поле
Кнопка "Get MAC addresses from selected computer" служит для подключения к выбранному компьютеру по WMI и получению информации о сетевых адаптерах и их MAC адресах, при этом MAC текущего интерфейса будет автоматически подставлен в поле "Computer MAC address". Используя галку "Include VMware Workstation interfaces", можно включить в выборку в том числе и виртуальные адаптеры от VMware Workstation(по умолчанию они игнорируются).

Данное приложение можно скачать по следующей ссылке: NetBootGUID.hta
Внимание! Если при запуске скачанного hta-файла вы получаете предупреждение безопасности от Windows, зайдите в свойства файла и нажмите "Разблокировать", иначе скрипты будут отрабатывать некорректно.

 

вторник, 28 октября 2014 г.

Как убрать появляющееся при запуске Windows 8 окно web-браузера с поисковой страницей Bing

Вызов окна web-браузера происходит автоматически после удачной проверки сетевого подключения к Интернету службой Microsoft NCSI. Для выключения данного функционала Windows достаточно изменить параметр реестра "EnableActiveProbing" с единицы на ноль:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet]
"EnableActiveProbing"=dword:00000000


Теперь поисковая система Bing перестанет вас беспокоить при старте ОС.

понедельник, 27 октября 2014 г.

Связываем аккаунты компьютеров в Active Directory с MAC адресами

Консоль Windows Deployment Services позволяет увидеть компьютерные аккаунты Active Directory у которых установлено значение параметра "netbootGUID". Этот параметр указывает WDS-сервису - компьютер с каким MAC адресом нужно связать с данной учётной записью.


Для того чтобы изменить "netbootGUID", воспользуйтесь утилитой "adsiedit.msc". Найдите объект вашего компьютера в оснастке, затем отредактируйте параметр.


Значение должно быть шестнадцатеричное и следующего формата:
00 00 00 00 00 00 00 00 00 00 XX XX XX XX XX XX
где XX XX XX XX XX XX - MAC адрес компьютера, который привязываем к аккаунту. Так, если MAC - BC5FF47015DE, после ввода информации ваше окно будет выглядеть следующим образом:


Теперь, при установке машины с соответствующим MAC, служба Windows Deployment Services будет автоматически назначать имя компьютеру и вводить его в домен согласно параметру "netbootGUID".

пятница, 24 октября 2014 г.

Ошибка WMware Workstation "Not enough physical memory is available to power on this virtual machine..."



Когда вы точно уверены, что на вашем компьютере достаточно свободной оперативной памяти для запуска виртуальной машины, и при этом вы получаете данную ошибку "Not enough physical memory is available to power on this virtual machine with its configured settings" от VMware Workstation, попробуйте нижеописанные способы решения:

1. Если ваша ОС - Windows 8.1, а версия Workstation - 10, вероятнее всего виновато обновление Microsoft KB2995388. Просто удалите его и проблема исчезнет.
2. Также вместо удаления обновлений можно добавить следующий параметр в конфигурационный файл "%ProgramData%\VMware\VMware Workstation\config.ini":

vmmon.disableHostParameters = "TRUE"

Это заставит виртуальную машину игнорировать ошибку. Перезагрузите компьютер и проблема исчезнет.

четверг, 23 октября 2014 г.

Ошибка в системном логе "Сбой обработки групповой политики из-за отсутствия сетевого подключения к контроллеру домена" с кодом 1129

Если данная ошибка постоянно появляется в логах при каждой загрузке компьютера - это как правило означает, что сетевое соединение не успевает инициализироваться до того как начнется применение групповых политик Active Directory. Решаем проблему следующим образом:

1. Самым простым вариантом является включение на сетевом коммутаторе режима PortFast. В этом случае порт, минуя стадию обучения, сразу переходит в состояние forwarding.
2. Если первый пункт невозможно выполнить, например, из-за наличия определённых политик сетевой безопасности в организации, то тогда можно включить следующую настройку групповой политики в домене:
"Конфигурация компьютера/Административные шаблоны/Система/Вход в систему/Всегда ждать сеть при запуске и входе в систему".
3. Некоторые специфические драйвера могут игнорировать данные групповые политики, тогда поможет следующий параметр в реестре:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
"GpNetworkStartTimeoutPolicyValue"=dword:0000003c


Данный параметр позволяет установить постоянную задержку в секундах перед началом применения групповых политик. Теперь все стартовые скрипты будут отрабатывать корректно, но загрузка системы замедлится - компьютер будет выдерживать установленный таймаут.
Если после вышеописанных способов у вас по прежнему появляется ошибка при загрузке с кодом 1129, увеличивайте значение параметра "GpNetworkStartTimeoutPolicyValue" до тех пор, пока проблема не исчезнет.

четверг, 25 сентября 2014 г.

Image Capture Boot Image Fails with 0xc000000f при загрузке образа, используя Windows Deployment Services

Такая ошибка характерна для службы Windows Deployment Services, размещённой на Windows 2012. Проявляется при попытке загрузиться из Capture Image образа, который, в свою очередь, создается через оснастку из Boot Image. При этом сам загрузочный образ работает корректно. Решается проблема с помощью распаковки и повторной сборки wim-файла Capture Image:

1. Зайдите на ваш сервер с установленной службой Windows Deployment Services с правами администратора.
2. Создайте пустую директорию, чтобы смонтировать туда образ. Например "C:\Mount".
3. Запустит командную строку с повышенными привилегиями.
4. Выполните "dism /mount-wim /wimfile:path-to-wim-file /mountdir:C:\Mount /index:1",
где path-to-wim-file - путь к вашему Capture Image файлу.
5. Затем "dism /unmount-wim /mountdir:C:\Mount /commit".
6. Директория "C:\Mount" больше не понадобится, её можно удалить.

После вышеописанных действий попробуйте заново загрузиться из Capture Image. Ошибка должна исчезнуть.

среда, 24 сентября 2014 г.

VBScript: просмотр лицензионного ключа Windows

Данный скрипт позволит увидеть введённый при установке системы лицензионный ключ Windows:

SET WshShell = CreateObject("WScript.Shell")
regKey = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"
DigitalProductId = WshShell.RegRead(regKey & "DigitalProductId")
WinProductName = "Windows Product Name: " & WshShell.RegRead(regKey & "ProductName") & vbNewLine
WinProductID = "Windows Product ID: " & WshShell.RegRead(regKey & "ProductID") & vbNewLine
WinProductKey = ConvertToKey(DigitalProductId)
strProductKey ="Windows Product Key: " & WinProductKey
WinProductID = WinProductName & WinProductID & strProductKey
MsgBox(WinProductID)

FUNCTION ConvertToKey(regKey)
 Const KeyOffset = 52
 isWin8 = (regKey(66) \ 6) And 1
 regKey(66) = (regKey(66) And &HF7) Or ((isWin8 And 2) * 4)
 j = 24
 Chars = "BCDFGHJKMPQRTVWXY2346789"
 DO
  Cur = 0
  y = 14
  DO
   Cur = Cur * 256
   Cur = regKey(y + KeyOffset) + Cur
   regKey(y + KeyOffset) = (Cur \ 24)
   Cur = Cur Mod 24
   y = y -1
  LOOP WHILE y >= 0
  j = j -1
  winKeyOutput = Mid(Chars, Cur + 1, 1) & winKeyOutput
  Last = Cur
 LOOP WHILE j >= 0
 IF (isWin8 = 1) THEN
  keypart1 = Mid(winKeyOutput, 2, Last)
  insert = "N"
  winKeyOutput = Replace(winKeyOutput, keypart1, keypart1 & insert, 2, 1, 0)
  IF Last = 0 THEN winKeyOutput = insert & winKeyOutput
 END IF
 a = Mid(winKeyOutput, 1, 5)
 b = Mid(winKeyOutput, 6, 5)
 c = Mid(winKeyOutput, 11, 5)
 d = Mid(winKeyOutput, 16, 5)
 e = Mid(winKeyOutput, 21, 5)
 ConvertToKey = a & "-" & b & "-" & c & "-" & d & "-" & e
END FUNCTION

вторник, 23 сентября 2014 г.

Как установить Windows 8.1 с ключом Windows 8, не используя обновление из магазина

В версии Windows 8 и выше при установке с компакт-диска необходимо в обязательном порядке ввести ключ, иначе установку невозможно будет продолжить. Но примечательно, что ключик от Windows 8 не подходит при установке 8.1 версии, хотя при этом прекрасно будет обновляться через магазин, скачивая из сети гигабайты данных.


Есть способ обойти данное недоразумение: необходимо добавить текстовый файл ei.cfg в папку sources инсталляционного диска. Сделать это можно с помощью программы UltraISO или другой похожей утилиты.

Содержание файла должно быть следующее:

[EditionID]
Professional
[Channel]
Retail
[VL]
0

где
 EditionID - идентификатор выпуска (Core, Professional, Enterprise)
 Channel - тип канала поставки (Retail или OEM)
 VL - тип лицензии (0 - обыкновенное лицензирование, 1 - через KMS-сервер)

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

1. Откройте cmd с повышенными привилегиями.
2. Вставьте ключ командой slmgr /ipk XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
3. Активируйте командой slmgr /ato или через телефон при отсутствии интернета.

После произведенных действий Windows 8.1 должна корректно активироваться в случае поддержки апгрейда вашим ключом от восьмерки.

суббота, 20 сентября 2014 г.

Недокументированная сборка всех системных настроек для версий Windows, начиная с Vista

Чтобы воспользоваться данной возможностью, необходимо создать в любом месте новый каталог и назвать его "Любое имя.{ED7BA470-8E54-465E-825C-99712043E01C}". Теперь из этого каталога вы сможете получить доступ сразу ко всем системным настройкам Windows.







четверг, 15 мая 2014 г.

PowerShell: скрипты для автоматизации одобрения обновлений на сервере WSUS

Скрипты служат для автоматического одобрения обновлений. Выполняются с помощью планировщика задач на сервере WSUS:

$WsusServer = "wsus.mycompany.corp"
$UseSSL = $false
$PortNumber = 80
$TrialRun = $false

#E-mail Configuration
$SMTPServer = "smtp.mycompany.corp"
$FromAddress = "WSUS@mycompany.corp"
[string[]] $Recipients = "admin1@mycompany.corp", "admin2@mycompany.corp", "admin3@mycompany.corp"
$MessageSubject = "WSUS :: Approving Updates to TEST domain"

Function SendEmailStatus($MessageSubject, $MessageBody)
{
$SMTPMessage = New-Object System.Net.Mail.MailMessage
$SMTPMessage.from = $FromAddress
foreach($recipient in $Recipients)
{
$SMTPMessage.to.Add($recipient)
}
$SMTPMessage.Subject = $MessageSubject
$SMTPMessage.Body = $MessageBody
$SMTPMessage.IsBodyHTML = $true
#Send the message via the local SMTP Server
$SMTPClient = New-Object System.Net.Mail.SMTPClient $SMTPServer
$SMTPClient.Send($SMTPMessage)
$SMTPMessage.Dispose()
rv SMTPClient
rv SMTPMessage
}

#Connect to the WSUS 3.0 interface.
[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | out-null
$WsusServerAdminProxy = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer($WsusServer,$UseSSL,$PortNumber);
$updates = $WsusServerAdminProxy.SearchUpdates('kb') | ?{-not $_.IsDeclined -and -not $_.IsApproved}
$groups = $WsusServerAdminProxy.GetComputerTargetGroups()
foreach ($group in $groups) {
if ($group.name -eq "domain test.corp" )
{
$sourcegroup = $group
}
}
If ($TrialRun)
{$MessageSubject += " Trial Run"}
Else
{$updates | %{$_.Approve('Install',$sourcegroup)}}
If ($updates.Count -gt 0)
{
$MessageBody = $updates | Select `
@{Name="Title";Expression={[string]$_.Title}},`
@{Name="KB Article";Expression={[string]::join(' | ',$_.KnowledgebaseArticles)}},`
@{Name="Classification";Expression={[string]$_.UpdateClassificationTitle}},`
@{Name="Product Title";Expression={[string]::join(' | ',$_.ProductTitles)}},`
@{Name="Product Family";Expression={[string]::join(' | ',$_.ProductFamilyTitles)}},`
@{Name="Uninstallation Supported";Expression={[string]$_.UninstallationBehavior.IsSupported}} | ConvertTo-HTML
SendEmailStatus $MessageSubject $MessageBody
}
Else
{
SendEmailStatus $MessageSubject "No new updates for approving to TEST domain"
}

В приведённом выше скрипте происходит автоматическое одобрение всех ещё не имеющих одобрение и при этом не отклоненных обновлений для указанной группы компьютеров (группа "domain test.corp").

$WsusServer = "wsus.mycompany.corp"
$UseSSL = $false
$PortNumber = 80
$TrialRun = $false

#E-mail Configuration
$SMTPServer = "smtp.mycompany.corp"
$FromAddress = "WSUS@mycompany.corp"
[string[]] $Recipients = "admin1@mycompany.corp", "admin2@mycompany.corp", "admin3@mycompany.corp"
$MessageSubject = "WSUS :: Approving Updates to All computers"

Function SendEmailStatus($MessageSubject, $MessageBody)
{
$SMTPMessage = New-Object System.Net.Mail.MailMessage
$SMTPMessage.from = $FromAddress
foreach($recipient in $Recipients)
{
$SMTPMessage.to.Add($recipient)
}
$SMTPMessage.Subject = $MessageSubject
$SMTPMessage.Body = $MessageBody
$SMTPMessage.IsBodyHTML = $true
#Send the message via the local SMTP Server
$SMTPClient = New-Object System.Net.Mail.SMTPClient $SMTPServer
$SMTPClient.Send($SMTPMessage)
$SMTPMessage.Dispose()
rv SMTPClient
rv SMTPMessage
}

#Connect to the WSUS 3.0 interface.
[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | out-null
$WsusServerAdminProxy = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer($WsusServer,$UseSSL,$PortNumber);
$updates = $WsusServerAdminProxy.SearchUpdates('kb') | ?{-not $_.IsDeclined} | ?{$_.ArrivalDate -gt (Get-Date).adddays(-22) -and $_.ArrivalDate -le (Get-Date).adddays(-14)}
$groups = $WsusServerAdminProxy.GetComputerTargetGroups()
foreach ($group in $groups) {
if ($group.name -eq "All Computers")
{
$targetgroup = $group
}
}
If ($TrialRun)
{$MessageSubject += " Trial Run"}
Else
{$updates | %{$_.Approve('Install',$targetgroup)}}
If ($updates.Count -gt 0)
{
$MessageBody = $updates | Select `
@{Name="Title";Expression={[string]$_.Title}},`
@{Name="KB Article";Expression={[string]::join(' | ',$_.KnowledgebaseArticles)}},`
@{Name="Classification";Expression={[string]$_.UpdateClassificationTitle}},`
@{Name="Product Title";Expression={[string]::join(' | ',$_.ProductTitles)}},`
@{Name="Product Family";Expression={[string]::join(' | ',$_.ProductFamilyTitles)}},`
@{Name="Uninstallation Supported";Expression={[string]$_.UninstallationBehavior.IsSupported}} | ConvertTo-HTML
SendEmailStatus $MessageSubject $MessageBody
}
Else
{
SendEmailStatus $MessageSubject "No new updates for approving to all"
}

Тут происходит выборка обновлений, которые не были отклонены во временном интервале начиная с трех недель назад, заканчивая двумя неделями назад. Затем данные обновления повторно одобряются уже для всех компьютеров.
Такой вариант работы с обновлениями Windows удобен, если у вас в организации существует тестовый домен для обкатки свежего софта и т.п. Новые обновления всегда удобнее проверять там, до того как они попадут в основную рабочую среду.
Перед началом использования необходимо установить константы в соответствии с вашей инфраструктурой. А конкретнее это: имя сервера, порт, флаг использования протокола SSL, флаг использования пробного режима, имя SMTP сервера для отправки отчёта, адреса отправителя и получателей, тема письма.

вторник, 13 мая 2014 г.

PowerShell: скрипт для автоматизации отклонения обновлений определённого типа на сервере WSUS

Данный скрипт поможет автоматически отклонять приходящие обновления на сервер WSUS, содержащие определённые словосочетания в названии. Так в нижеприведённом примере будут отклоняться обновления, содержащие слова: "itanium", "ia64", "lync", "publisher".

$WsusServer = "wsus.mycompany.corp"
$UseSSL = $false
$PortNumber = 80
$TrialRun = $false

#E-mail Configuration
$SMTPServer = "smtp.mycompany.corp"
$FromAddress = "WSUS@mycompany.corp"
[string[]] $Recipients = "admin1@mycompany.corp", "admin2@mycompany.corp", "admin3@mycompany.corp"
$MessageSubject = "WSUS :: Declining Updates"

Function SendEmailStatus($MessageSubject, $MessageBody)
{
$SMTPMessage = New-Object System.Net.Mail.MailMessage
$SMTPMessage.from = $FromAddress
foreach($recipient in $Recipients)
{
$SMTPMessage.to.Add($recipient)
}
$SMTPMessage.Subject = $MessageSubject
$SMTPMessage.Body = $MessageBody
$SMTPMessage.IsBodyHTML = $true
#Send the message via the local SMTP Server
$SMTPClient = New-Object System.Net.Mail.SMTPClient $SMTPServer
$SMTPClient.Send($SMTPMessage)
$SMTPMessage.Dispose()
rv SMTPClient
rv SMTPMessage
}

#Connect to the WSUS 3.0 interface.
[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | out-null
$WsusServerAdminProxy = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer($WsusServer,$UseSSL,$PortNumber);
$itanium = $WsusServerAdminProxy.SearchUpdates('itanium') | ?{-not $_.IsDeclined -and -not $_.IsApproved}
$itanium += $WsusServerAdminProxy.SearchUpdates('ia64') | ?{-not $_.IsDeclined -and -not $_.IsApproved}
$itanium += $WsusServerAdminProxy.SearchUpdates('lync') | ?{-not $_.IsDeclined -and -not $_.IsApproved}
$itanium += $WsusServerAdminProxy.SearchUpdates('publisher') | ?{-not $_.IsDeclined -and -not $_.IsApproved}
If ($TrialRun)
{$MessageSubject += " Trial Run"}
Else
{$itanium | %{$_.Decline()}}
If ($itanium.Count -gt 0)
{
$MessageBody = $itanium | Select `
@{Name="Title";Expression={[string]$_.Title}},`
@{Name="KB Article";Expression={[string]::join(' | ',$_.KnowledgebaseArticles)}},`
@{Name="Classification";Expression={[string]$_.UpdateClassificationTitle}},`
@{Name="Product Title";Expression={[string]::join(' | ',$_.ProductTitles)}},`
@{Name="Product Family";Expression={[string]::join(' | ',$_.ProductFamilyTitles)}},`
@{Name="Uninstallation Supported";Expression={[string]$_.UninstallationBehavior.IsSupported}} | ConvertTo-HTML
SendEmailStatus $MessageSubject $MessageBody
}
Else
{
SendEmailStatus $MessageSubject "No new updates for declining"
}

Перед началом использования необходимо установить константы в соответствии с вашей инфраструктурой. А конкретнее это: имя сервера, порт, флаг использования протокола SSL, флаг использования пробного режима, имя SMTP сервера для отправки отчёта, адреса отправителя и получателей, тема письма.

понедельник, 12 мая 2014 г.

PowerShell: скрипт для автоматизации очистки сервера WSUS от устаревших обновлений

Запуск данного скрипта можно задать в планировщике задач и больше не беспокоиться о необходимости периодически производить очистку сервера WSUS.

$WsusServer = "wsus.mycompany.corp"
$UseSSL = $false
$PortNumber = 80

#E-mail Configuration
$SMTPServer = "smtp.mycompany.corp"
$FromAddress = "WSUS@mycompany.corp"
[string[]] $Recipients = "admin1@mycompany.corp", "admin2@mycompany.corp", "admin3@mycompany.corp"
$MessageSubject = "WSUS :: CleanUP Updates"

Function SendEmailStatus($MessageSubject, $MessageBody)
{
$SMTPMessage = New-Object System.Net.Mail.MailMessage
$SMTPMessage.from = $FromAddress
foreach($recipient in $Recipients)
{
$SMTPMessage.to.Add($recipient)
}
$SMTPMessage.Subject = $MessageSubject
$SMTPMessage.Body = $MessageBody
$SMTPMessage.IsBodyHTML = $true
#Send the message via the local SMTP Server
$SMTPClient = New-Object System.Net.Mail.SMTPClient $SMTPServer
$SMTPClient.Send($SMTPMessage)
$SMTPMessage.Dispose()
rv SMTPClient
rv SMTPMessage
}

[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | out-null
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer($WsusServer,$UseSSL,$PortNumber);
$cleanupScope = new-object Microsoft.UpdateServices.Administration.CleanupScope;
$cleanupScope.DeclineSupersededUpdates = $true
$cleanupScope.DeclineExpiredUpdates = $true
$cleanupScope.CleanupObsoleteUpdates = $true
$cleanupScope.CompressUpdates = $true
$cleanupScope.CleanupObsoleteComputers = $true
$cleanupScope.CleanupUnneededContentFiles = $true 
$cleanupManager = $wsus.GetCleanupManager();
$MessageBody = $cleanupManager.PerformCleanup($cleanupScope) | ConvertTo-HTML
SendEmailStatus $MessageSubject $MessageBody

Перед началом использования необходимо установить константы в соответствии с вашей инфраструктурой. А конкретнее это: имя сервера, порт, флаг использования протокола SSL, имя SMTP сервера для отправки отчёта, адреса отправителя и получателей, тема письма.

пятница, 25 апреля 2014 г.

Отключение выбора пользователя и ввода пароля при запуске Windows

Если вы пользуетесь ПК дома и вам неудобно каждый раз выбирать пользователя и вводить пароль, то можно воспользоваться следующей настройкой ОС Windows:

1. Выполните команду "control userpasswords2";
2. В появившемся окне снимите галочку "Требовать ввод имени пользователя и пароля" и нажмите "Применить";


3. В окне "Автоматический вход в систему" введите имя пользователя, под которым будет осуществляться логон в систему, и пароль с подтверждением.

Чтобы вернуться к первоначальному способу входа в ОС, установите обратно галочку "Требовать ввод имени пользователя и пароля".

четверг, 24 апреля 2014 г.

Установка ограничений для ОС Windows по использованию оперативной памяти и ядер процессора

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

1. Выполняем команду "msconfig";
2. Переходим в закладку "Загрузка", затем нажимаем "Дополнительные параметры";
3. Ставим галочки: "Число процессоров", "Максимум памяти" и устанавливаем необходимые ограничения;
4. После перезагрузки системы ваша Windows будет использовать только тот объём ресурсов, который вы указали в настройках:


Данный функционал доступен во всех версиях ОС Windows начиная с Vista.

среда, 16 апреля 2014 г.

VBScript: реализация повышения уровня привилегий при запуске скрипта

При написании vbs-скрипта для повседневного использования часто возникает необходимость в выполнении команд с повышенным уровнем привилегий. В самом простом варианте можно запускать скрипт с помощью "runas" или из другой программы, которая, в свою очередь, уже была выполнена с повышением привилегий. Но лучше пойти другим путём.
Ниже приведен пример реализации обработки контроля учётных записей в коде самого скрипта:

Const DQ = """", HKLM = &H80000002, KQV = &H1, KSV = &H2
SET colOS = GetObject("winmgmts:\root\cimv2").ExecQuery("Select * from Win32_OperatingSystem")
FOR EACH oOS IN colOS
 strOSLong = oOS.Version
NEXT
IF Left(strOSLong, 1) > "5" THEN
    IF NOT isAdminRights THEN
  SET oShellApp = CreateObject("Shell.Application")
  oShellApp.ShellExecute WScript.FullName, DQ & WScript.ScriptFullName & DQ, "", "runas", 1
  WScript.Quit
    END IF
END IF
''''''''''Begin of code''''''''''''''''''''''''''''''
'
'
'
''''''''''End of code''''''''''''''''''''''''''''''''
FUNCTION isAdminRights()
 SET oReg = GetObject("winmgmts:root\default:StdRegProv")
 strKey = "System\CurrentControlSet\Control\Session Manager"
 intErrNum = oReg.CheckAccess(HKLM, strKey, KQV + KSV, flagAccess)
 isAdminRights = flagAccess
END FUNCTION

В данном примере происходит проверка на наличие необходимых прав доступа к ветке реестра "System\CurrentControlSet\Control\Session Manager". В случае их отсутствия, скрипт сам себя перезапускает с уже повышенными привилегиями. Вам остаётся лишь добавить код в обозначенном месте.

вторник, 15 апреля 2014 г.

VBScript: скрытие проблемных обновлений Windows в домене с помощью Group Policy

Скрипт позволяет массово скрывать определённые обновления при выполнении на каждом компьютере с помощью групповой политики домена. Администратору необходимо только корректно задать номера KB в начальном массиве.

DIM hideupdates(2)
hideupdates(0) = "KB2925418"
hideupdates(1) = "KB2930275"
hideupdates(2) = "KB2929961"
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
SET updateSession = createObject("Microsoft.Update.Session")
SET updateSearcher = updateSession.CreateupdateSearcher()
SET searchResult = updateSearcher.Search("IsHidden=0 and IsInstalled=0 and Type='Software'")
FOR i = 0 TO searchResult.Updates.Count-1
 SET update = searchResult.Updates.Item(i)
 FOR j = LBound(hideupdates) TO UBound(hideupdates)
  IF instr(1, update.Title, hideupdates(j), vbTextCompare) <> 0 THEN
   update.IsHidden = TRUE
  END IF
 NEXT
NEXT

Перед использованием сделайте следующие изменения скрипта:
1. Задайте количество ячеек массива в первой строке: hideupdates(0 - 1 запись, 1 - 2 записи, 2 - 3 записи и т.д.).
2. Пропишите свои номера обновлений в ячейках массива так же, как сделано в скрипте, лишние удалите или закомментируйте.
 3. Добавьте vbs-файл в политики домена для выполнения во время загрузки ОС.

Данный скрипт в групповых политиках удобно сочетать с фильтром WMI или другим скриптом по определению версии ОС Windows.

понедельник, 14 апреля 2014 г.

Сбрасываем RDP сессию удалённо

Если при попытке подключения к серверу по протоколу RDP вы видите окошко: "The terminal server has exceeded the maximum number of allowed connections" - это означает превышение максимально допустимого числа соединений(до 2 для серверов Windows по умолчанию). Происходит это из-за того, что пользователи забывают завершить свой сеанс и просто отключаются от сервера.


Для того, чтобы убить сессию на удалённом компьютере, выполните следующие команды:

1. Для начала нужно выполнить запрос и узнать какие сессии в данный момент активны на удалённом сервере:

query session /server:servername_or_IP"

2. Затем осуществляем сброс сессии, используя её идентификатор (ID):

reset session ID /server:servername_or_IP

servername_or_IP - имя или IP адрес удалённого хоста.

Выполнять данные команды необходимо только под пользователем, являющимся локальным администратором на удалённой машине!

пятница, 11 апреля 2014 г.

VBScript: поиск и удаление устаревших учётных записей компьютеров в Active Directory

Скрипт предназначен для поиска в Active Directory учётных записей персональных компьютеров, которые по каким либо причинам давно не синхронизировались с доменом.
Чтобы начать работу, необходимо прописать начальные значения следующих переменных:

FQDN - имя LDAP вашего домена или нужной ветки;
intTimeLimit - считать записи устаревшими, если они не синхронизировались более данного количества дней назад;
flagDelete - может принимать два значения:
    TRUE - выполнять удаление при поиске учётных записей;
    FALSE - режим чтения, только отображать информацию.

ON ERROR RESUME NEXT
FQDN = "DC=mydomain,DC=corp" 'Input your Fully Qualified Domain Name or LDAP path to subtree
intTimeLimit = 360  'Time limit in number of days
flagDelete = FALSE  'Flag for deleting old computers. FASLE = find only, TRUE = find and DELETE!!!
Const ADS_SCOPE_SUBTREE = 2
SET objConnection = CreateObject("ADODB.Connection")
SET objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
SET objCommand.ActiveConnection = objConnection
objCommand.CommandText = "Select Name,distinguishedName,lastLogon from " & "'LDAP://" & FQDN & "' where objectClass='computer'"
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
SET objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
DO UNTIL objRecordset.EOF
 objLogon = objRecordSet.Fields("lastLogon")
 intLogonTime = objLogon.HighPart * (2^32) + objLogon.LowPart
 intLogonTime = intLogonTime / (60 * 10000000)
 intLogonTime = intLogonTime / 1440
 IF intLogonTime + #1/1/1601# < Now - intTimeLimit THEN
  Wscript.Echo "Computer Name: " & objRecordSet.Fields("Name").Value
  Wscript.Echo "Path: " & objRecordSet.Fields("distinguishedName").Value
  WScript.Echo "Approx last logon timestamp: " & intLogonTime + #1/1/1601#
  Wscript.Echo "=========================================================" 
  IF flagDelete THEN
   SET objComputer = GetObject("LDAP://" & objRecordSet.Fields("distinguishedName").Value)
   objComputer.DeleteObject(0)
  END IF
 END IF
    objRecordSet.MoveNext
LOOP

Особенно внимательным нужно быть с переменной "intTimeLimit"!!!
Задание слишком малого значения может привести к потери практически всех компьютерных аккаунтов!!!

Для удобства скрипт лучше запускать с помощью "cscript.exe".

среда, 9 апреля 2014 г.

VBScript: автоматизация поиска и установки обновлений Windows без участия пользователя

Нижеприведенный скрипт позволяет автоматизировать процесс установки обновлений Windows на только что проинсталлированную систему:

'''''''''''''''''''''''''''''''''''''     Auto Update VBScript for Windows      '''''''''''''''''''''''''''''''
'''
ON ERROR RESUME NEXT
''' Constants and variables
Attempt = 3                'Number of attempts to get updates
Const PauseTime = 15    'Number of minutes for pause between searching
Const HKEY_LOCAL_MACHINE = &H80000002
strUserName = "WinUpdate"
strFullName = "Windows Update Account"
strDescr = "Windows Update Account for AutoLogon"
strPassword = "1234567"
strGroupSID = "S-1-5-32-544"  'Well Known SID of the Administrators group
''' Detection OS and elevate privileges
SET colOS = GetObject("winmgmts:\root\cimv2").ExecQuery("Select * from Win32_OperatingSystem")
FOR EACH oOS IN colOS
    strOSLong = oOS.Version
NEXT
IF Left(strOSLong, 1) > "5" AND WScript.Arguments.length = 0 THEN
 SET oShellApp = CreateObject("Shell.Application")
 oShellApp.ShellExecute "cscript.exe", Chr(34) & WScript.ScriptFullName & Chr(34) & " uac", "//NoLogo //S", "runas", 1
 WScript.Quit
END IF
''' Copy script to Temp folder and restart them
SET WshNetwork = WScript.CreateObject("WScript.Network")
strComputer = WshNetwork.ComputerName
SET WshShell = WScript.CreateObject("WScript.Shell")
SET objFSO = CreateObject("Scripting.FileSystemObject")
IF NOT objFSO.FileExists(WshShell.ExpandEnvironmentStrings("%SystemDrive%") & "\Temp\autoupdate.vbs") THEN 
 IF NOT objFSO.FolderExists(WshShell.ExpandEnvironmentStrings("%SystemDrive%") & "\Temp") THEN 
  objFSO.CreateFolder(WshShell.ExpandEnvironmentStrings("%SystemDrive%") & "\Temp")
 END IF
 objFSO.CopyFile Wscript.ScriptFullName, WshShell.ExpandEnvironmentStrings("%SystemDrive%") & "\Temp\autoupdate.vbs", TRUE
 WshShell.Run "cscript //NoLogo //S " & WshShell.ExpandEnvironmentStrings("%SystemDrive%") & "\Temp\autoupdate.vbs"
 WScript.Quit
ELSE
 IF Wscript.ScriptFullName <> WshShell.ExpandEnvironmentStrings("%SystemDrive%") & "\Temp\autoupdate.vbs" THEN
  WshShell.Run "cscript //NoLogo //S " & WshShell.ExpandEnvironmentStrings("%SystemDrive%") & "\Temp\autoupdate.vbs"
  WScript.Quit
 END IF
''' Preparing user for autologon
 WScript.Echo "Setup user....................................................................."
''' Check if local account already exists
 intExists = 0
 SET objSystem = GetObject("WinNT://" & strComputer)
 objSystem.Filter = Array("user")
 FOR EACH objUser IN objSystem
  IF objUser.Name = strUserName THEN
   intExists = 1
  END IF
 NEXT
'''  Finging correct title of admins group
 strGroupName = GetGroupName(strComputer, strGroupSID)
'''  Creating the user autoupdate
 IF intExists = 0 THEN
  SET objUser = objSystem.Create("user", strUserName)
  objUser.FullName = strFullName
  objUser.Description = strDescr
  objUser.SetPassword strPassword
  objUser.SetInfo
  SET objGroup = GetObject("WinNT://" & strComputer & "/" & strGroupName & ",group")
'''  Adding autoupdate to the admins group
  SET objUser = GetObject("WinNT://" & strComputer & "/" & strUserName & ",user")
  objGroup.Add(objUser.ADsPath)
 END IF
'''  Deleting the AutoLogonCount
 SET oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
 strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
 strValueName = "AutoLogonCount"
 oReg.DeleteValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName
'''  Setting forceAutoLogon to TRUE
 SET oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
 strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
 strValueName = "ForceAutoLogon"
 strValue = "1"
 oReg.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
''' Setting the default username to be the same as strUserName
 SET oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
 strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
 strValueName = "DefaultUserName"
 strValue = strUsername
 oReg.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
'''  Setting the default password to be same as strPassword
 SET oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
 strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
 strValueName = "DefaultPassword"
 strValue = strPassword
 oReg.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
'''  Setting AutoAdminLogon to TRUE
 SET oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
 strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
 strValueName = "AutoAdminLogon"
 strValue = "1"
 oReg.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
'''  Setting the default login domain to be the local machine
 SET oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
 strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
 strValueName = "DefaultDomainName"
 strValue = strComputer
 oReg.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
 '''  Setting AutoRun after reboot
 IF Left(strOSLong, 1) > "5" THEN
  WshShell.Run "%WINDIR%\system32\SCHTASKS.exe /Create /TN Autoupdater /TR ""cscript " & WshShell.ExpandEnvironmentStrings("%SystemDrive%") & "\Temp\autoupdate.vbs //S //NoLogo"" /F /RL HIGHEST /IT /SC ONLOGON /RU " & strComputer & "\" & strUserName, 0
 ELSE
  SET oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
  strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
  strValueName = "autoupdate"
  strValue = "cscript //NoLogo //S " & WshShell.ExpandEnvironmentStrings("%SystemDrive%") & "\Temp\autoupdate.vbs"
  oReg.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
 END IF
'''  Searching Updates
 WScript.Echo "Searching Updates:"
 DO
  Attempt = Attempt - 1
  WScript.Echo "Searching in progress...           (Number of remaining attempts is " & Attempt & ")"
  SET updateSession = createObject("Microsoft.Update.Session")
  SET updateSearcher = updateSession.CreateupdateSearcher()
  SET searchResult = updateSearcher.Search("IsHidden=0 and IsInstalled=0 and Type='Software'")
  IF searchResult.Updates.Count <> 0 OR Attempt = 0 THEN EXIT DO
  WScript.Echo "Waiting for " & PauseTime & " minutes before next searching..."
  WshShell.Run "%WINDIR%\system32\wuauclt.exe /detectnow", 0
  WScript.Sleep PauseTime*60000
 LOOP WHILE Attempt > 0
''' Downloading Updates
 IF Attempt > 0 THEN 'If there are updates for installing
  IF searchResult.Updates.Count <> 0 THEN
   WScript.Echo searchResult.Updates.Count & " updates are available."
  END IF
  flagDownload = 0
  FOR i = 0 To searchResult.Updates.Count-1
   SET update = searchResult.Updates.Item(i)
   IF update.IsDownloaded = FALSE THEN
    SET updatesToDownload = CreateObject("Microsoft.Update.UpdateColl")
    updatesToDownload.Add(update)
    IF updatesToDownload.Count = 1 AND flagDownload = 0 THEN
     WScript.Echo "Downloading Updates............................................................"
     flagDownload = 1
    END IF
    WScript.Echo "Downloading: " & update.Title
    SET downloader = updateSession.CreateUpdateDownloader() 
    downloader.Updates = updatesToDownload
    downloader.Download()
   END IF
  NEXT
''' Installing Updates
  WScript.Echo "Installing Updates............................................................."
  FOR i = 0 To searchResult.Updates.Count-1
   SET update = searchResult.Updates.Item(i)
   SET updatesToInstall = CreateObject("Microsoft.Update.UpdateColl")
   updatesToInstall.Add(update)  
   WScript.Echo "Installing: " & update.Title
   SET installer = updateSession.CreateUpdateInstaller()
   installer.Updates = updatesToInstall
   SET installationResult = installer.Install()
   IF ((installationResult.RebootRequired = TRUE) OR (Err.Number <> 0)) THEN
    WScript.Echo "Reboot after 3 seconds for complete installation of update!"
    WScript.Sleep 3000
    SET objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate,(Shutdown)}!\\" & strComputer & "\root\cimv2")
    SET colOperatingSystems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
    FOR EACH objOperatingSystem IN colOperatingSystems
     objOperatingSystem.Reboot()
    NEXT
   END IF
  NEXT
 ELSE 'If no more updates
  WScript.Echo "Cleaning script information..."
'''  Setting AutoAdminLogon to FALSE
  SET oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
  strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
  strValueName = "AutoAdminLogon"
  strValue = "0"
  oReg.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
'''  Deleting forceAutoLogon
  SET oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
  strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
  strValueName = "ForceAutoLogon"
  oReg.DeleteValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName
'''  Deleting AutoRun after reboot
  IF Left(strOSLong, 1) > "5" THEN
   WshShell.Run "%WINDIR%\system32\SCHTASKS.exe /Delete /TN Autoupdater /F", 0
  ELSE
   SET oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
   strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
   strValueName = "autoupdate"
   oReg.DeleteValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName
  END IF
'''  Deleting the default password to be same as strPassword
  SET oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
  strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
  strValueName = "DefaultPassword"
  oReg.DeleteValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName
'''  Deleting autoupdate user
  objSystem.Delete "user", strUserName
'''  Deleting temporary script file
  objFSO.DeleteFile(Wscript.ScriptFullName)
  SET fc = objFSO.GetFolder(WshShell.ExpandEnvironmentStrings("%SystemDrive%") & "\Temp").Files
  IF 0 = fc.Count THEN
   objFSO.DeleteFolder(WshShell.ExpandEnvironmentStrings("%SystemDrive%") & "\Temp")
  END IF
 END IF
'''Finishing
 WScript.Echo "Complete, computer reboots after 5 seconds!"
 WScript.Sleep 5000
 SET objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate,(Shutdown)}!\\" & strComputer & "\root\cimv2")
 SET colOperatingSystems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
 FOR EACH objOperatingSystem IN colOperatingSystems
  objOperatingSystem.Reboot()
 NEXT
END IF
''''''''''''''''''Function for obtaining name of local Administrators group''''''''''''''''
FUNCTION GetGroupName(sComputer, sGroupSID)
 DIM oGroupAccounts, oGroupAccount
 SET oGroupAccounts = GetObject("winmgmts://" & sComputer & "/root/cimv2").ExecQuery("Select Name from Win32_Group" & " WHERE Domain = '" & sComputer & "' AND SID = '" & sGroupSID & "'")
 FOR EACH oGroupAccount IN oGroupAccounts
  GetGroupName = oGroupAccount.Name
 NEXT
END FUNCTION
''''''''''''''''''

Принцип работы следующий: Скрипт копирует себя в папку Temp и перезапускается с повышенными привилегиями в случае ОС Windows Vista и выше. Также, для автоматизации работы, создает пользователя WinUpdate и настраивает для него автоматический вход в систему, прописывается в автозапуск. Далее происходит поиск и установка обновлений, перезагрузка, и снова поиск и установка. Это длится до тех пор, пока скрипт не перестает находить новые обновления. Когда все попытки поиска исчерпаны, скрипт очищает все сделанные изменения в ОС и удаляется из папки Temp.
Управлять поиском можно с помощью переменной Attempt(количество предпринимаемых попыток поиска обновлений) и константы PauseTime(длина паузы между попытками поиска в минутах).
Скачать готовый vbs-файл можно по данной ссылке.

вторник, 8 апреля 2014 г.

VBScript: установка пароля локального Администратора

Данный скрипт будет полезен для смены пароля локального Администратора на компьютерах в домене. Поскольку аккаунт идентифицируется с помощью SID, код будет работать для любых локализаций Windows.


SET WshNetwork = WScript.CreateObject("WScript.Network")
strComputer = WshNetwork.ComputerName
SET objSystem = GetObject("winmgmts://" & strComputer & "/root/cimv2").ExecQuery("Select * from Win32_UserAccount WHERE Domain = '" & strComputer & "'")
FOR EACH objUser IN objSystem
 IF Left(objUser.SID, 8) = "S-1-5-21" AND Right(objUser.SID, 3) = "500" THEN
  SET oSystem = GetObject("WinNT://" & strComputer)
  SET oUser = oSystem.GetObject("user", objUser.Name)
  oUser.SetPassword "NEW_PASSWORD"
  oUser.SetInfo
 END IF
NEXT

Скрипт успешно тестировался на всех версиях ОС Windows начиная с XP.

вторник, 25 марта 2014 г.

Скрипт для удобного управления Windows Updates

В некоторых случаях, в административных целях, групповой политикой может быть заблокирована консоль установки обновлений Windows. Обладая правами локального администратора на хосте, можно временно её разблокировать, до следующего применения политики. Для этого нужно отредактировать параметры реестра:

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoWindowsUpdate"=dword:00000000
"NoAutoUpdate"=dword:00000000


По данной ссылке можно скачать HTA-приложение(с использованием VBScript-а) для управление обновлениями Windows на локальном компьютере в обход стандартной консоли:WUManager.hta


Для успешной установки обновлений обязательно понадобится запуск приложения с повышенными привилегиями, особенно на Windows 8 и выше(не спасает даже полное отключение Контроля учётных записей).
Также стоит отметить, что все манипуляции с обновлениями можно произвести запуская программу только на локальной машине. Для удаленных хостов доступен только режим просмотра, и ещё нужно не забыть открыть необходимые порты фаервола для WMI запросов.

Внимание! Если при запуске скачанного hta-файла вы получаете предупреждение безопасности от Windows, зайдите в свойства файла и нажмите "Разблокировать", иначе скрипты будут отрабатывать некорректно.

пятница, 21 марта 2014 г.

VBScript: определение версии браузера Internet Explorer

Код примера на Visual Basic Script:


Set WshShell = WScript.CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
ieversion = objFSO.GetFileVersion(WshShell.ExpandEnvironmentStrings("%ProgramFiles%") & "\Internet Explorer\IExplore.exe")
MsgBox "Current IE version is " & ieversion
MsgBox "Current IE major version is " & Split(ieversion,".")(0)


Первый MessageBox выводит полное(вплоть до сборки) значение версии, находящееся в переменной "ieversion".
Второй MessageBox выводит мажорную версию браузера. Достигается это путем разбора строки "ieversion" с помощью функции "Split". А сам номер мажорной версии оказывается в нулевом элементе полученного массива: " Split(ieversion,".")(0) "

четверг, 20 марта 2014 г.

VBScript: использование текущих переменных среды Windows

Для получения значения переменной среды ОС Windows, используя код Visual Basic скрипта, можно воспользоваться следующим примером:


Set WshShell = WScript.CreateObject("WScript.Shell")
v = WshShell.ExpandEnvironmentStrings("%SystemRoot%")
MsgBox v


Здесь мы получаем значение переменной "SystemRoot". Полный список назначенных переменных среды можно просмотреть набрав в консоли команду "SET".

среда, 26 февраля 2014 г.

Вызов синего экрана смерти и получение MEMORY DUMP в ручном режиме

MEMORY DUMP представляет из себя содержимое оперативной памяти системы в определенный момент времени, часто может быть полезен при отладке проблемного ПО или драйверов. Microsoft предоставляет возможность получение дампа памяти Windows с помощью сочетания клавиш: правый Control + двойной Scroll Lock (настройки по умолчанию). Работает функция на клавиатурах PS/2 начиная с Windows 2000, для USB всё несколько сложнее, корректно будет отрабатывать только на серверных Windows 2003, на ОС Vista и более поздних.

Для активации ручного BSOD добавьте параметр CrashOnCtrlScroll типа REG_DWORD в реестр по следующему пути:

- для PS/2 клавиатуры: "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\i8042prt\Parameters"

- для USB клавиатуры: "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\kbdhid\Parameters"

Также не забудьте настроить нужный тип получаемого дампа в свойствах системы:


Более подробно про данные возможности можно узнать тут.