Работа с Windows Server

Работа с Windows Server - пишу для себя повседневные приёмы работы с сервером. Заметка не претендует на полноту и со временем будет дополняться.


Устранение ошибок

Подразумевается что есть уверенность насчет хорошего состояния железа - памяти, жесткого диска, рабочей температуры процессора и отсутствуют программные зловреды - вирусы, косое/кривое/несовместимое/устаревшее ПО. Также считается, что Windows еще "не укатана" до того состояния, когда она вываливается в BSOD при загрузке. Вот из этого и исходим - работает, но плохо.

Чистка

Много ошибок встречается когда Windows сильно замусорена, какие-то непонятные ошибки, а потом оказывается что гигабайты, а то и десяток гигабайт временных файлов. Чистить - DISM++ для Windows 2008  и выше (от 2003 нужно уже отказываться, функционала ведь никакого и на мой взгляд, оставить эту ОС можно только для старых серверов, при условии, что работает она хорошо - несложные сетевые шары, вот весь спектр вариантов использования данной ОС в 2017+ году).

Тут же приводим в порядок системный репозиторий Windows, хранящийся в папке WinSxS. Соответствующий чекбокс в Dism++, на старых инсталляциях легко можно получить выигрыш свободного места 10-15GB.

В последних версиях Dism++ чистка WinSxS не отрабатывает, другой вариант чистить при помощи скрипта:

sc stop msiserver
sc stop TrustedInstaller
sc config msiserver start= disabled
sc config TrustedInstaller start= disabled
icacls "%WINDIR%\WinSxS" /save "%WINDIR%\WinSxS.acl" /t
takeown /f "%WINDIR%\WinSxS" /r
icacls "%WINDIR%\WinSxS" /grant %username%:(F) /t
compact /s:"%WINDIR%\WinSxS" /c /a /i *
icacls "%WINDIR%\WinSxS" /setowner "NT SERVICE\TrustedInstaller" /t
icacls "%WINDIR%" /restore "%WINDIR%\WinSxS.acl"
sc config msiserver start= demand
sc config TrustedInstaller start= demand

Особенна полезна чистка  на терминальных серверах, где место дорого, по этой же причине всегда включаю там Квоты:

Работа с Windows Server

Последнее - чистим реестр Windows. Какое средство выбрать, каждый решает сам, пользуюсь Ccleaner - чистит он неглубоко, зато гарантированно ничего не угробит. Ставим общий автозапуск для всех пользователей:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"CCleaner Monitoring"="\"C:\\Program Files\\CCleaner\\CCleaner.exe\" /MONITOR"

Проделав данные манипуляции, возможно большинство проблем вы не решите, но часть из них точно уйдет, плюс ОС начинает работать быстрее даже на глаз - чем старее инсталляция, тем заметнее.

Ошибки Windows

Ошибки самой Windows. Под ошибками здесь подразумеваю не ошибки, скажем, в просмотре событий, а какое-то нештатное поведение ОС, снижающее функциональность, то есть другими словами - когда что-то не работает - то, что должно работать. Можно конечно найти решение в интернете или FixIt от MS - и возможно поможет, но это скорее заплата, латание дыр, потом может вылезти еще проблема, затем еще.. Если ситуация именно такова, то нужны общие методы оздоровления системы, а не заплаты.

Проверяем целостность системных файлов

Первый способ - для этого запускаем командную строку от Администратора и выполняем команду:

sfc /scannow

Работает даже на таких древних ОС как Windows Server 2003 (вот как раз для неё нужно будет вставить компакт-диск с дистрибутивом).

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

Второй способ для новых ОС начиная с Windows Server 2012 используя DISM.exe также с помощью командной строки:

  • DISM.exe /Online /Cleanup-image /CheckHealth — для получения информации о состоянии и наличии повреждений компонентов Windows. При этом сама проверка не производится, а лишь проверяются ранее записанные значения;
  • DISM.exe /Online /Cleanup-image /ScanHealth — проверка целостности и наличия повреждений хранилища компонентов. Может занять продолжительное время и может показаться, что команда зависла, но на самом деле нужно будет подождать ещё немного;
  • DISM.exe /Online /Cleanup-image /Restorehealth — производит и проверку и автоматическое восстановление системных файлов Windows.
Восстанавливаем WMI

WMI — как говорит Википедия:

..WMI — это одна из базовых технологий для централизованного управления и слежения за работой различных частей компьютерной инфраструктуры под управлением платформы Windows...

Понятное дело, что если Windows не может адекватно оценивать свое состояние, то есть есть ошибки в WMI, никакой нормальной работы не получится. Предлагаю воспользоваться отличным средством - на ваш страх и риск! - которым пользовался и пользуюсь - //www.lansweeper.com/kb/47/How-to-repair-a-corrupt-WMI-installation.html 

Ошибки ПО

Глючит или не запускается установленное ПО. Можно смотреть журналы, искать ошибки и искать в интернете солюшены, но есть более универсальный метод, который помогает не во всех, но во многих случаях. Поскольку с нуля ПО давно уже никто не пишет и большинство программ написано с использованием сред разработки NET. Framework 1-2-3-4, то достаточно восстановить рабочее состояние этой среды для устранения ошибок приложения. Сделать можно быстрее и проще всего с помощью специального инструмента NetFxRepairTool. Это первый инструмент, который нужно использовать и только в случае когда он не поможет, вот тогда  уже начинать ломать голову и поиски решений в интернете.


Скрипты

Функционал Windows совершенствуется от версии к версии, хорошо, но до такого состояния, что все нужные утилиты и инструменты будут под рукой, очень далеко. И тут на выручку приходят самописные скрипты - cmd, vbs, ps1. Поскольку помнить их на память нереально, а искать каждый раз по интернету и тратить время на доработку - долго, то образцы рабочих скриптов нужно где-то складировать. Буду делать это здесь.


Обычные скрипты

Запускаются встроенным Планировщиком Windows.

Архивация файловой шары

CMD скрипт:

@echo off
"c:\program files\7-zip\7z.exe" a -r -m0=BZip2 -mmt=on -mx5 -ssw \\Server\D$\Папка\Файл-%date%.7z D:\Папка_которую_нужно_жать | findstr /P /I /V "Compressing 7-Zip" >> \\Server\D$\Папка\log_file.%date%.txt
  • -ssw архивирует открытые другими программами файлы;
  • -mmt=on использовать многопоточность (в 8 параллельных потоков -mmt=8);
  • -ms=off создается не solid-архив;
  • -mx3 степень сжатия (стандартная 5, высокая 7);
  • для более чем двухъядерных систем лучше использовать bzip2 формат (родной для 7z формат сжатия LZMA поддерживает только 2-а потока, остальные форматы сжатия максимум один поток).

Команда FINDSTR для сохранения в лог файл только нужной информации.

  • /P пропускает строки, содержащие непечатные символы;
  • /I на всякий случай игнорирую регистр букв;
  • /V " " непосредственно перечень слов для поиска в строках и последующего исключения этих строк.

Полученный лог файл можно нормально прочитать, если открыть через браузер.

Чистка устаревших архивов

VBS скрипт:

Set Fso = CreateObject("Scripting.FileSystemObject")
Set Directory = Fso.GetFolder("D:\Папка_для_чистки")
Set Files = Directory.Files

For Each Modified in Files
 If DateDiff("D", Modified.DateLastModified, Now) > 18 Then Modified.Delete
Next

Конструкций  For-Then-Next можно напихать несколько, число - архивы старше количества дней числа будут удалены.

Архив MS SQL

CMD скрипт:

sqlcmd -S имя_сервера -U имя_юзера_sql -P пароль -i d:\скрипт_sql.sql
"c:\Program Files\7-zip\7z.exe" a -m0=lzma2 -mmt=on d:\Файл_%date%.7z \\Server\D$\tmp\*.bak
del \\Server\D$\tmp\*.bak

работает вместе с SQL скриптом:

DECLARE @pathName NVARCHAR(512)

SET @pathName = 'D:\tmp\Промежуточное_имя_' + Convert(varchar(8), GETDATE(), 112) + '.bak' 
BACKUP DATABASE [Имя_базы] TO DISK = @pathName WITH NOFORMAT, NOINIT, NAME = N'Промежуточное_имя', SKIP, NOREWIND, NOUNLOAD, STATS = 10
  • Позволяет выгружать базы на удалённый сервер, чего не умеет встроенный в SQL Планировщик;
  • Позволяет запускать скрипт как на сервере с SQL и выгружать на удаленный сервер, так и на удаленном сервере непосредственно;
  • CMD скрипт запускает SQL скрипт, тот выгружает базы в локальную папку tmp, затем CMD скрипт жмёт содержимое папки на удаленный сервер и после очищает её;
  • Конструкций SET-DECLARE-BACKUP в SQL скрипте может быть несколько.
Оповещение о перезагрузке сервера

PS1 скрипт:

#IP-адрес или доменное имя почтового сервера, например, mail.ionline.by
$IPMailServer="ip"
#Адрес отправителя. Внимание, он же является логином для авторизации.
$SenderEmail="e-mail"
#Адрес получателя
$RecipientEmail="e-mail2"
#Пароль на ящик
$pass = 'пароль'
#Functions
function Send-mail ($subj = "VM" ,$body = "Text", $AttachPath = "0")
{
$SMTPClient = new-object System.Net.Mail.SMTPClient
$Msg = new-object System.Net.Mail.MailMessage
 
if ($AttachPath -ne "0")
{
$Attach = new-object System.Net.Mail.Attachment($AttachPath)
$Msg.Attachments.add($Attach)
} 
$Msg.To.Add($RecipientEmail)
$Msg.from=$SenderEmail
$Msg.Subject = $subj 
$Msg.Body= $body
$SMTPClient.Host=$IPMailServer
$SMTPClient.Credentials=New-Object System.Net.NetworkCredential "$SenderEmail" , "$pass"
$SMTPClient.Send($Msg)
#$Attach.Dispose()
} 
#Code
$time = Get-Date
$servname = $env:computername
$date = Get-Date -UFormat %T
Send-mail -subj "$date $servname включение сервера" -body "$time ВНИМАНИЕ! Сервер $servname был включен (плановая перезагрузка в субботу в 6 утра)."

Скрипты через групповые политики

Создает новый объект групповой политики, редактируется, затем либо в секции User configuration-Polices-Windows settings-Scripts (Logon/Logoff), либо в секции Computer configuration-Polices-Windows settings-Scripts (Startup/Shutdown) определяется нужный скрипт. Вторую секцию лучше отключить и нужно правильно применить политику - если политика Computer configuration, то применить к OU, где находятся компьютеры, если User configuration, то к OU, где находятся пользователи - иначе не будет работать. Выбор простой: для всех пользователей компьютера - скрипт в Computer configuration, для избранных - в секцию User configuration. Подробнее можно прочесть в интернете.

Добавление сетевого диска

CMD скрипт:

@net use Z: \\Шара
  • Скрипт пересоздаёт диск каждый раз;
  • Конструкций Net Use может быть несколько.

VBS скрипт:

dim wn, fs, oDrives, source
set fs=Wscript.CreateObject("Scripting.FileSystemObject")
set wn=Wscript.CreateObject("Wscript.Network")
Set oDrives = wn.EnumNetworkDrives

Source = "\\Шара"

if fs.DriveExists("O:") then
 For i = 0 to oDrives.Count - 1 
 if oDrives.Item(i) = Source then
 wscript.quit
 else
 end if
 next
 wn.RemoveNetworkDrive "O:",Force,true
 wn.MapNetworkDrive "O:",Source,false
 else
 wn.MapNetworkDrive "O:",Source,false
 End if
  • Проверяет подключён уже этот диск или нет;
  • Конструкций IF-END IF может быть несколько.
Ярлык Консультант+

VBS скрипт:

Dim WSHSysEnv, DesktopPath, FSO, WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
DesktopPath = WSHShell.SpecialFolders("Desktop")
Set WSHSysEnv = WSHShell.Environment("Process")
strProfile = WSHSysEnv.Item("USERPROFILE")
FileName = "\\Шара\Consultant.lnk"

if not FSO.FolderExists(strProfile & "\ConsUserData") Then
 fso.createfolder strProfile & "\ConsUserData"
 Else
End If

if not FSO.FileExists(strDesktop & "\Consultant.lnk") Then
 fso.CopyFile FileName, DesktopPath & "\Consultant.lnk", true
 Else
 WScript.Quit
End If

Берёт ярлык из шары и запихивает его на Рабочий стол пользователя, попутно создаёт папку в профиле пользователя ConsUserData и вся работа ведётся через эту папку, а не через папку в корне диска C:/. Для этого в самом ярлыке нужно указать Start in:

Работа с Windows Server
Ярлык с заданной картинкой

VBS скрипт на примере ярлыка для почты Zimbra:

Dim MyShortcut, MyDesktop, DesktopPath, FSO, WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
DesktopPath = WSHShell.SpecialFolders("Desktop")
icotarget = WSHShell.SpecialFolders("MyDocuments")
FileName = "\\Шара\zimbra.ico"

if not FSO.FileExists(icotarget & "\Zimbra\Zimbra.ico") Then
 fso.createfolder icotarget & "\Zimbra"
 fso.CopyFile FileName, icotarget & "\Zimbra\Zimbra.ico", true
 Else
End If

if not FSO.FileExists(strDesktop & "\Zimbra.lnk") Then
 Set MyShortcut = WSHShell.CreateShortcut(DesktopPath &_
 "\Zimbra.lnk")
 MyShortcut.TargetPath = WSHShell.ExpandEnvironmentStrings _
 ("https://ip")
 MyShortcut.Windowstyle="4"
 MyShortcut.IconLocation = WSHShell.ExpandEnvironmentStrings _
 (icotarget & "\Zimbra\Zimbra.ico")
 MyShortcut.Save
 Else
 WScript.Quit
End If

Скрипт берёт картинку для ярлыка из шары и создаёт на Рабочем столе пользователя ярлык на страницу входа в Zimbra для браузера по умолчанию.

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

Полезные материалы от MS.

Leave a Comment

Scroll to Top