май 07
Проблемы с SCVMM Admin Console после установки Update Rollup 6

​После установки Update Rollup 6 для System Center 2012 R2 Virtual Machine Manager обнаружилась странная проблема - при попытке создать виртуальную машину или просто посмотреть свойства шаблона или профиля оборудования консоль администратора SCVMM (процесс VmmAdminUI.exe) начала падать с ошибкой System.Reflection.TargetInvocationException.

Похоже, что это какая-то проблема с локализацией, потому что у немца обнаружилась такая же проблема с порталом самообслуживания https://social.technet.microsoft.com/Forums/ru-RU/eab3a316-1cd3-450b-963d-d97be94cf395/scvmm-2012-r2-ru-6-self-service-user-konsole-strzt-ab

Решается переименованием (или удалением) папки родного языка в C:\Program Files\Microsoft System Center 2012 R2\Virtual Machine Manager\bin. Например, "ru" в "ru_". После этого переименования консоль запускается с английским интерфейсом и всё работает прекрасно.

Полный текст сообщения об ошибке:

Приложение: VmmAdminUI.exe
Версия платформы: v4.0.30319
Описание. Процесс был завершен из-за необработанного исключения.
Сведения об исключении: System.Reflection.TargetInvocationException
Стек:
   в System.Windows.Window.ShowDialog()
   в Microsoft.VirtualManager.UI.WizardFramework.WizardWindow.ShowWizard(Microsoft.VirtualManager.UI.WpfControls.DialogOwner, Microsoft.VirtualManager.UI.WizardFramework.Flow)
   в Microsoft.VirtualManager.UI.Dialogs.VMProperties.VMPropertiesLauncher.ShowDialog(Microsoft.VirtualManager.UI.Data.IClientDataContext, System.Windows.Window, Microsoft.SystemCenter.VirtualMachineManager.VMBase, Microsoft.VirtualManager.UI.Dialogs.VMProperties.VMPropertiesPage, Boolean)
   в Microsoft.VirtualManager.UI.Pages.Library.LibraryActionHelper.ShowVMProperties(Microsoft.SystemCenter.VirtualMachineManager.ILibraryObject, Microsoft.VirtualManager.UI.ConsoleFramework.ActionContext)
   в Microsoft.VirtualManager.UI.Pages.Library.LibraryActionHelper.ShowProperties(Microsoft.SystemCenter.VirtualMachineManager.ILibraryObject, Microsoft.VirtualManager.UI.ConsoleFramework.ActionContext)
   в Microsoft.VirtualManager.UI.Pages.Library.PropertiesActionGroup`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].ShowProperties(System.__Canon, Microsoft.VirtualManager.UI.ConsoleFramework.ActionContext)
   в Microsoft.VirtualManager.UI.Pages.Library.SingleLibraryObjectActionBase`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].OnClick()
   в Microsoft.VirtualManager.UI.ConsoleControls.DataGridViewModel`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].FindAndRunAction(System.Predicate`1<Microsoft.VirtualManager.UI.ConsoleFramework.ActionBase>)
   в Microsoft.VirtualManager.UI.ConsoleControls.DataGridViewModel`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].RunDefaultAction()
   в Microsoft.VirtualManager.UI.ConsoleControls.SearchableDataGrid.DataGrid_RowDoubleClick(System.Object, System.Windows.RoutedEventArgs)
   в System.Windows.RoutedEventHandlerInfo.InvokeHandler(System.Object, System.Windows.RoutedEventArgs)
   в System.Windows.EventRoute.InvokeHandlersImpl(System.Object, System.Windows.RoutedEventArgs, Boolean)
   в System.Windows.UIElement.RaiseEventImpl(System.Windows.DependencyObject, System.Windows.RoutedEventArgs)
   в System.Windows.UIElement.RaiseEvent(System.Windows.RoutedEventArgs)
   в Microsoft.EnterpriseManagement.DataCenterManager.UI.DataGrid.SCDataGrid.SCDataGridRow_MouseDoubleClick(System.Object, System.Windows.Input.MouseButtonEventArgs)
   в System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(System.Delegate, System.Object)
   в System.Windows.RoutedEventArgs.InvokeHandler(System.Delegate, System.Object)
   в System.Windows.RoutedEventHandlerInfo.InvokeHandler(System.Object, System.Windows.RoutedEventArgs)
   в System.Windows.EventRoute.InvokeHandlersImpl(System.Object, System.Windows.RoutedEventArgs, Boolean)
   в System.Windows.UIElement.RaiseEventImpl(System.Windows.DependencyObject, System.Windows.RoutedEventArgs)
   в System.Windows.UIElement.RaiseEvent(System.Windows.RoutedEventArgs)
   в System.Windows.Controls.Control.OnMouseDoubleClick(System.Windows.Input.MouseButtonEventArgs)
   в System.Windows.Controls.Control.HandleDoubleClick(System.Object, System.Windows.Input.MouseButtonEventArgs)
   в System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(System.Delegate, System.Object)
   в System.Windows.RoutedEventArgs.InvokeHandler(System.Delegate, System.Object)
   в System.Windows.RoutedEventHandlerInfo.InvokeHandler(System.Object, System.Windows.RoutedEventArgs)
   в System.Windows.EventRoute.InvokeHandlersImpl(System.Object, System.Windows.RoutedEventArgs, Boolean)
   в System.Windows.UIElement.ReRaiseEventAs(System.Windows.DependencyObject, System.Windows.RoutedEventArgs, System.Windows.RoutedEvent)
   в System.Windows.UIElement.OnMouseDownThunk(System.Object, System.Windows.Input.MouseButtonEventArgs)
   в System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(System.Delegate, System.Object)
   в System.Windows.RoutedEventArgs.InvokeHandler(System.Delegate, System.Object)
   в System.Windows.RoutedEventHandlerInfo.InvokeHandler(System.Object, System.Windows.RoutedEventArgs)
   в System.Windows.EventRoute.InvokeHandlersImpl(System.Object, System.Windows.RoutedEventArgs, Boolean)
   в System.Windows.UIElement.RaiseEventImpl(System.Windows.DependencyObject, System.Windows.RoutedEventArgs)
   в System.Windows.UIElement.RaiseTrustedEvent(System.Windows.RoutedEventArgs)
   в System.Windows.UIElement.RaiseEvent(System.Windows.RoutedEventArgs, Boolean)
   в System.Windows.Input.InputManager.ProcessStagingArea()
   в System.Windows.Input.InputManager.ProcessInput(System.Windows.Input.InputEventArgs)
   в System.Windows.Input.InputProviderSite.ReportInput(System.Windows.Input.InputReport)
   в System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr, System.Windows.Input.InputMode, Int32, System.Windows.Input.RawMouseActions, Int32, Int32, Int32)
   в System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr, MS.Internal.Interop.WindowMessage, IntPtr, IntPtr, Boolean ByRef)
   в System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   в MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   в MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)
   в System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
   в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
   в System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)
   в MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)
   в MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)
   в System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)
   в System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame)
   в System.Windows.Threading.Dispatcher.Run()
   в System.Windows.Application.RunDispatcher(System.Object)
   в System.Windows.Application.RunInternal(System.Windows.Window)
   в System.Windows.Application.Run(System.Windows.Window)
   в Microsoft.VirtualManager.UI.VmmAdmin.Program.Main(System.String[])

янв 28
Подключение к SQL server в другом домене с использованием Windows-аутентификации

​Иногда возникает необходимость подключиться к SQL server, находящемуся в другом домене с использованием аутентификации Windows, однако Management Studio не даёт возможности ввести другие учётные данные

mgmtstudiologin.png 

Решением этой проблемы может быть добавление учётных данных другого домена в "Диспетчер учётных данных Windows" 

windows_store.png 

Для этого нужно ввести имя сервера с указанием порта и учётные данные удалённого домена

sql_cred.png 

После этого нужно в окне подключения SQL Management Studio ввести имя сервера с указанием порта (через запятую) и она чудесным образом подключится к удаленному SQL server с учётными данными другого домена.

Источник: http://www.mssqltips.com/sqlservertip/3250/connect-to-sql-servers-in-another-domain-using-windows-authentication/

дек 17
Настройка Network UPS Tools

​Network UPS Tools представляет собой набор программ, которые обеспечивают общий
интерфейс для мониторинга и администрирование UPS оборудования. NUT позволяет работать нескольким серверам с одним UPS и позволяет штатно отключать необходимые серверы в случае разрядки батареи, а также возможен мониторинг текущего состояния UPS (нагрузка/зарядка/входная мощность).

 

Схема включения в серверной

Схема 

Несколько UPS подключены к серверу кабелем управления. Это master система со службами upsd и upsmon в режиме мастера. Остальные системы - это slave, для них необходимы только upsmon в подчиненном режиме.  Все команды от master системы подчиненные получают по сети.

 

Установка

Для Debian дистрибутивов пакет nut есть в репозиториях

Выполняем

apt-get install nut-client nut-server

Для Windows систем на сайте (http://www.networkupstools.org/download.html#_binary_packages) есть инсталлятор.

Скачиваем и запускаем установщик от имени администратора. Для master системы так же в инсталляторе выбираем установку libUSB.

 

Структура NUT

процессы:

upsd - сервер

upsmon - клиент

 

программы:

upsc - программа общения с сервером вручную

upsdrvctl - программа запуска драйвера ИБП вручную

upscmd - программа посылки команд в ИБП вручную

upssched - скрипт для гибкой обработки событий от ИБП

 

конфигурационные файлы:

nut.conf - указывает тип работы nut

ups.conf - конфигурация драйвера и способа подключения к ИБП

upsd.conf - конфигурация сервера

upsd.user - описание клиентов и пользователей

upsmon.conf - конфигурация клиента, строка соединения с сервером

upssched.conf - логика отработки событий через скрипт upssched

 Сервер upsd поддерживает связь с ИБП и отвечает на запросы клиентов upsmon.Процесс upsmon (клиент) отвечает за своевременное обнаружение проблем с питанием и принятие необходимых решений.

Примеры конфигурационных файлов

Конфигурация NUT задаётся в файле nut.conf одной строкой:

  • Для master системы MODE=netserver
  • Для slave MODE=netclient

Логика работы с событиями от ИБП задаётся клиентом upsmon в его файле конфигурации upsmon.conf:

  • на master системе:

MONITOR apc1500up@localhost 2 localuser localpass master

MONITOR apc1500low@localhost 2 localuser localpass master

MINSUPPLIES 2

SHUTDOWNCMD "C:\\WINDOWS\\system32\\shutdown.exe -s -t 0"

NOTIFYCMD "C:\\NUT\\bin\\upssched.exe"

POLLFREQ 5

POLLFREQALERT 5

HOSTSYNC 15

DEADTIME 15

POWERDOWNFLAG "C:\\killpower"

NOTIFYMSG ONLINE     "UPS %s on line power"

NOTIFYMSG ONBATT     "UPS %s on battery"

NOTIFYMSG LOWBATT    "UPS %s battery is low"

NOTIFYMSG FSD        "UPS %s: forced shutdown in progress"

NOTIFYMSG COMMOK     "Communications with UPS %s established"

NOTIFYMSG COMMBAD    "Communications with UPS %s lost"

NOTIFYMSG SHUTDOWN   "Auto logout and shutdown proceeding"

NOTIFYMSG REPLBATT   "UPS %s battery needs to be replaced"

NOTIFYMSG NOCOMM     "UPS %s is unavailable"

NOTIFYMSG NOPARENT   "upsmon parent process died - shutdown impossible"

NOTIFYFLAG ONLINE    SYSLOG+WALL+EXEC

NOTIFYFLAG ONBATT    SYSLOG+WALL+EXEC

NOTIFYFLAG LOWBATT   SYSLOG+WALL+EXEC

NOTIFYFLAG FSD       SYSLOG+WALL+EXEC

NOTIFYFLAG COMMOK    SYSLOG+WALL+EXEC

NOTIFYFLAG COMMBAD   SYSLOG+WALL+EXEC

NOTIFYFLAG SHUTDOWN  SYSLOG+WALL+EXEC

NOTIFYFLAG REPLBATT  SYSLOG+WALL+EXEC

NOTIFYFLAG NOCOMM    SYSLOG+WALL+EXEC

NOTIFYFLAG NOPARENT  SYSLOG+WALL+EXEC

RBWARNTIME 43200

NOCOMMWARNTIME 300

FINALDELAY 1000

 

  • на slave системе:

MONITOR apc1500up@master_name_or_ip 2 remoteuser remotepass slave

MONITOR apc1500low@ master_name_or_ip 2 remoteuser remotepass slave

MINSUPPLIES 2

SHUTDOWNCMD "C:\\WINDOWS\\system32\\shutdown.exe -s -t 0"

POLLFREQ 5

POLLFREQALERT 5

HOSTSYNC 15

DEADTIME 15

POWERDOWNFLAG "C:\\killpower"

RBWARNTIME 43200

NOCOMMWARNTIME 300

FINALDELAY 5

 

MONITOR system powervalue username password type

MINSUPPLIES - указываем количество блоков питания которые должны получать мощность сохраняя систему запущенной.

SHUTDOWNCMD - upsmon выполняет эту команду, когда системе необходимо выключиться.

POLLFREQ - опрос мониторами с частотой (измеряется в секундах) для обычной деятельности. Вы можете отрегулировать это частоту опроса, чтобы upsmon не “зашумлял” вашу сеть, но не вносите слишком большие значения тк. оно может пропустить отключение питания.

POLLFREQALERT - опрос UPS с частотой в секундах. Можно сделать значение поменьше, чем POLLFREQ для лучшей чувствительности работы батареи.

HOSTSYNC - как долго upsmon будет ждать перед переходом к следующему upsmon. master upsmon использует это число при ожидании slaves чтобы отключиться после того как он установил флаг принудительное завершение работы (FSD). И если slaves не отключаться после этого тайм аута, то выключение продолжится без них.

DEADTIME - интервал ожидания перед объявлением статуса UPS как «мертвый» upsmon требует, чтобы UPS предоставлял свою статус информацию, каждые несколько секунд (см. POLLFREQ и POLLFREQALERT). Если статус загрузки, UPS помечен fails. И если оно остается fails более чем DEADTIME секунд, то UPS помечается «мертвый».

POWERDOWNFLAG - флаг файла для форсирования завершения работы UPS в master системе.

NOTIFYMSG - изменение сообщения, отправленные upsmon при возникновении определенных событий.

NOTIFYCMD - upsmon отправляет сообщение при происшествиях. это программа входит в пакет nut и предназначена для запуска какого-нибудь скрипта по наступлению события и заданного интервала времени. Программа upssched срабатывает на те события в описании которых присутствует слово +EXEC.

NOTIFYFLAG - изменение поведения upsmon при возникновении событий NOTIFY.

RBWARNTIME - предупреждение замены аккумулятора в секундах.

NOCOMMWARNTIME - предупреждение по времени при не общении к UPS в секундах.

FINALDELAY - через сколько выполнить SHUTDOWNCMD.

 

Отредактировав nut.conf и upsmon.conf, настройка slave системы закончена. Остальные конфигурационные файлы необходимы для master.

 

ups.conf

Служит для контроля доступа к серверу и для установки других значений конфигурации.

Пример файла:

LISTEN 127.0.0.1 3493

LISTEN 10.10.0.146 3493

LISTEN address port - здесь указывается IP адрес и порт 3493 (по умолчанию) для прослушивания подключений. Так же на мастере необходимо открыть этот порт для подключений.

 

ups.conf

В этом конфигурационном файле указываются настройки подключения UPS.

Пример:

[apc1500up]

            driver = usbhid-ups

            port = auto

            desc = "Back-UPS 1500 up"

            serial = "#############"

            ignorelb

            override.battery.charge.low = 50

            override.battery.charge.warning = 80

 

[apc1500low]

            driver = usbhid-ups

            port = auto

            desc = "Back-UPS 1500 lower"

            serial = "#############"

            ignorelb

            override.battery.charge.low = 50

            override.battery.charge.warning = 80

[ups_name] - это имя используется как адрес вашего UPS. Вы можете его изменить на любое произвольное имя.

driver - драйвер, используемый для работы с UPS. Для APC обычно используется usbhid-ups.

port - порт, на котором висит UPS (для подключения через USB указываете значение "auto").

serial – так как используются 2 UPS, то что бы NUT умел их различать указываются их серийные номера.  

UPS сначала должен быть подключен один, параметр serial закомментирован и в ups.conf указан только один UPS. Серийный номер получаем из вывода команды upsc apc1500up@localhost ups.serial. Отключили один, включили второй. Повторили команду. И теперь ups.conf можно приводить к финальному виду.

ignorelb – перезапись параметров UPS на свои, указанные ниже. Так как с аккумуляторами беда, установил уровни зарядов low и warning на 50 и 80 соответственно, вместо дефолтных 10 и 50.

 

upsd.users

Контроль доступа для UPS демона (профили пользователей). Именно в этом файле вы указываете, кто и в какой мере будет работать с NUT.

Пример:

[admin]

            password = password

            upsmon master

            allowfrom = localhost

            actions = SET

            instcmds = ALL

 

[localuser]

            password  = localpass

            upsmon master

           

[remoteuser]

            password  = remotepass

            upsmon slave

Значения:

[NAME] - имя пользователя.

password - пароль пользователя.

actions - возможность настройки.

instcmds - выполняемые команды.

upsmon - вид подключения клиентов.

upsmon master - полные полномочия управлением питания подключенных к системе. UPS под управлением этого upsmon и отвечает за выключение разряженного аккумулятора. Выключение происходит после безопасного выключения всех slave мониторов. Если ваш UPS подключен непосредственно к системе через последовательный порт, то для upsmon этой системы следует определить его как master.

 

upsmon slave - эта система, под управлением upsmon master и она не выключается непосредственно. Операционная система будет выключена перед отключением питания master. Используйте этот режим при запуске монитора на других серверах работающих на том же UPS. И очевидно, что только один сервер может быть подключен к последовательному порту на UPS, коим будет является master. Все остальные сервера будут slave.

 

upssched.conf

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

Алгоритм обработки событий +EXEC, указанных в upsmon.conf, записывается в файле upssched.conf например:

CMDSCRIPT "C:\\upssched.bat"

PIPEFN "C:\\upssched.pipe"

LOCKFN "C:\\upssched.lock"

AT ONBATT * START-TIMER stopcluster 60

AT LOWBATT * EXECUTE sendshutdown

AT ONLINE * CANCEL-TIMER stopcluster

PIPEFN и LOCKFN наверно нужны для правильной обработки таймеров в скрипте.

AT ONBATT * START-TIMER stopcluster 60 

говорит о том, что если на любом (*) ИБП произошёл переход на батареи, то надо запустить таймер stopcluster на 60 сек.

AT ONLINE * CANCEL-TIMER stopcluster

если в течении 60 сек.  питание возвратится, то нужно сбросить таймер, а если нет то произойдёт вызов CMDSCRIPT upssched.bat с параметром stopcluster. Вот пример такого скрипта upssched.bat:

ECHO OFF

CD C:\NUT\bin\

GOTO CASE_%1

:CASE_stopcluster

    powershell -executionpolicy unrestricted -Command "ping 127.0.0.1"

    upsmon -c fsd

    GOTO END_SWITCH

REM :CASE_sendshutdown

REM   upsmon -c fsd

REM    GOTO END_SWITCH

:END_SWITCH

 

Обработать можно следующие события

# ONLINE   : UPS is back online

# ONBATT   : UPS is on battery

# LOWBATT  : UPS has a low battery (if also on battery, it's "critical")

# FSD      : UPS is being shutdown by the master (FSD = "Forced Shutdown")

# COMMOK   : Communications established with the UPS

# COMMBAD  : Communications lost to the UPS

# SHUTDOWN : The system is being shutdown

# REPLBATT : The UPS battery is bad and needs to be replaced

# NOCOMM   : A UPS is unavailable (can't be contacted for monitoring)

# NOPARENT : The process that shuts down the system has died (shutdown impossible)

 

Таким образом, итоговый алгоритм выключения таков:

Если пропало питание, то включается таймер stopcluster на минуту, если не вернулось, то выполняется upssched.bat, в нем прописана powershell команда, после выполнениния которой выполнится upsmon -c fsd (NUT выставляет флаг "Forced Shutdown" и ждёт 15сек. (параметр HOSTSYNC в upsmon.conf) для того чтобы slave клиенты успели принять FSD флаг, и начать завершение работы, т.е. выполнить SHUTDOWNCMD). После выключения всех slave, выключается master.

 

Ссылки

https://sites.google.com/site/plan0metr/home/nut

http://www.ignix.ru/book/freebsd/daemon/network_ups_tools

http://andy.od.ua/news_print_46.html

https://ru.opensuse.org/SDB:Перевод_конфигурационных_файлов_NUT

окт 16
IIS как пограничный веб-сервер

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

Постановка задачи
Разберём на примере сервера YouTrack. Он представлен неприглядным srv-youtrack-01.kg.ru и находится на веб-сервере внутри компании. Задача заключается в том, чтобы обеспечить доступ к нему из интернета по красивому имени yt.kg.ru. При этом обязательно должен использоваться https. 

Реализация
Для начала работы нам понадобится установить компонент URL Rewrite. Это можно сделать при помощи web platform installer, а также вручную. После его установки мы увидим в диспетчере служб IIS новый ярлык
переопределение URL-адресов".

При помощи этого инструмента можно создать правило переопределения адресов "обратный прокси-сервер".
При создании правила нужно указать URL сервера (без префикса http:// - его IIS добавит автоматически), на который будет происходить проксирование. В итоге мы получим правило, доступное для редактирования. Оно применяется не ко всем запросам, а только к тем, которые подходят под критерии, которые мы можем настраивать. Для начала проверяется URL на соответствие шаблону, после чего в ход идут проверки по другим критериям.

Сразу оговорюсь, что тут есть два пути: первый путь - создать набор правил с разными шаблонами URL-адресов для разных ресурсов на одном IIS-сайте; а второй - создать по сайту для каждого проксируемого ресурса и в каждом из них сделать по одному правилу. Понимая, что первый путь более джедайский, я все-таки избрал путь второй - пусть не такой красивый, зато я не рискую написав неправильное регулярное выражение для одного сайта сломать всю маршрутизацию. Поэтому шаблон URL-адреса у меня везде дефолтный "(.*)".

Итак, я создаю сайт yt.kg.ru с биндингами на 80 и 443 порт и обязательным указанием имени узла, чтобы IIS знал, к какому сайту я обращаюсь. Про получение и установку сертификата для 443 позволю себе не упоминать. Обращу лишь внимание, что сам сервис настраивать на использование https не нужно - внутри сети шифроваться не от кого, а внешние запросы будут соединяться по ssl с пограничным сервером, который будет уже по незащищенному каналу проксировать запросы внутри сети.
Покуда обязательным требованием является использование https, будем проксировать только те запросы, которые приходят на 443 порт, для чего создадим простое условие. При его создании предлагается выпадающий список возможных вариантов.


Отлично, теперь все запросы https://yt.kg.ru проксируются на внутренний сервер с неприглядным именем srv-youtrack-01 прозрачно для пользователя.

Однако, все запросы http://yt.kg.ru отсекаются с ошибкой 403, что не очень красиво. Для решения этой проблемы можно либо создать index.html с редиректом, либо еще одно правило URL Rewrite, у которого в поле "действие" выберем постоянное перенаправление на нужный нам URL.

Следует обратить внимание, что правила для сайта применяются по порядку, поэтому сначала нужно расположить правило с условием, а потом правило без условий. При этом, так как второе правило применяется ко всем URL без исключения, для первого правила необходимо поставить (оставить поставленной) галочку "Остановить обработку последующих правил".

После манипуляций с графическим интерфейсом в корне нашего сайта создается web.config, который содержит все созданные правила. Поэтому если требуется проксировать еще какой-то сайт, то эти манипуляции повторять не нужно, можно просто скопировать web.config и изменить в нем требуемый URL или после копирования воспользоваться графическим интерфейсом для изменения правил. Более того, можно вообще не пользоваться интерфейсом, а писать сразу туда - кому как нравится.

Подводные камни
При переходе на вкладку "Agile boards" YouTrack генерит URL-адрес вида https://yt.kg.ru/rest/agile/Overview-0/sprint/Iteration+24. Далее, при переключении между спринтами https://yt.kg.ru/rest/agile/Overview-0/sprint/Iteration%252023?q=. При переходе на эти урлы IIS стал возвращать мне 404 ошибку. Это свидетельствовало о том, что запросы не проксируются. При этом переходы между сохраненными запросами вида https://yt.kg.ru/issues/IT?q=%23{Current+work}+Assigned+to%3A+me+updated%3A+{This+week} вполне корректно отрабатывали.
Эксперименты с добавлением знака вопроса в середину проблемного URL закончились тем, что я стал получать 404 ошибку уже от YouTrack-сервера, а не IIS. Это натолкнуло меня на мысль, что IIS как-то по-своему (привет, Microsoft) интерпретирует URL и это надо исправить.
Проблема со знаком "плюс" в середине адреса решилась добавлением параметра <requestFiltering allowDoubleEscaping="true" />:

<system.webServer>

    <security>

            <requestFiltering allowDoubleEscaping="true" />

    </security>

</system.webServer>

но после этого все еще не работало переключение между спринтами. Выяснилось, что IIS считает такие запросы небезопасными. Эту проверку тоже пришлось отключить:

<system.web>
    <httpRuntime requestPathInvalidCharacters="" />
</system.web>

Итоги
Вероятно, решения, которые я нашел, не являются оптимальными и вместо разрешения всего подряд нужно было аккуратно прописать правила, подходящие в конкретном случае. Но сейчас это работает и этого пока достаточно.
Таким образом у нас в организации проксируются абсолютно все веб-серверы, среди которых есть и nginx, и apache, и svn, и gitlab, и exchange web access.

 

Основная проблема, которая заставляет меня находиться в поиске решения заключается в том, что через прокси не работает NTLM-авторизация, так нужная для многих сервисов компании Microsoft. Мёртвый продукт TMG использовать не хочется, поэтому сейчас пытаюсь разобраться с новой службой Windows Server 2012 R2 под названием Web Application Proxy параллельно поглядывая на nginx и apache, которые, кажется, тоже пока не умеют проксировать NTLM.

Ссылки
http://www.ifinity.com.au/Blog/EntryId/60/404-Error-in-IIS-7-when-using-a-Url-with-a-plus-sign-in-the-path
http://stackoverflow.com/questions/2831142/asp-net-4-url-limitations-why-url-cannot-contain-any-3f-characters

 

сен 23
Накопительный пакет обновления 3 для System Center 2012 R2 Virtual Machine Manager

​Следует отметить интересный факт о накопительном обновлении 3 для SCVMM 2012 R2.
Дело в том, что это обновление, как для сервера, так и для консоли управления, приходит среди прочих через центр обновления Windows

20140923044323827.png
Однако, в статье KB2695414 в разделе "Installation instructions" говорится о необходимости выполнить sql-скрипт для корректной работы обновления:

 

/* script starts here */ ALTER Procedure [dbo].[prc_RBS_UserRoleSharedObjectRelation_Insert] ( @ID uniqueidentifier, @ObjectID uniqueidentifier, @ObjectType int, @RoleID uniqueidentifier, @UserOrGroup varbinary (85), @ForeignAccount nvarchar (256), @IsADGroup bit, @ExistingID uniqueidentifier = NULL OUTPUT ) AS SET NOCOUNT ON SELECT @ExistingID = [ID] FROM [dbo].[tbl_RBS_UserRoleSharedObjectRelation] WHERE [ObjectID] = @ObjectID AND [RoleID] = @RoleID AND -- Select owner OR Select all which matches ForeignAccount or UserOrGroup OR -- both ForeignAccount and UserOrGroup is NULL (([UserOrGroup] = @UserOrGroup OR [ForeignAccount] = @ForeignAccount) OR ([UserOrGroup] IS NULL AND @UserOrGroup IS NULL AND [ForeignAccount] IS NULL AND @ForeignAccount IS NULL)) /* Ignore duplicate entries */ IF (@ExistingID IS NULL) BEGIN INSERT [dbo].[tbl_RBS_UserRoleSharedObjectRelation] ([ID] ,[ObjectID] ,[ObjectType] ,[RoleID] ,[UserOrGroup] ,[ForeignAccount] ,[IsADGroup] ,[IsOwner] ) VALUES ( @ID, @ObjectID, @ObjectType, @RoleID, @UserOrGroup, @ForeignAccount, @IsADGroup, 0 ) END SET NOCOUNT OFF RETURN @@ERROR GO ALTER PROCEDURE [dbo].[prc_WLC_IsVHDSharedByAnotherVmOnHost] @HostId [uniqueidentifier], @VHDId [uniqueidentifier], @VMId [uniqueidentifier] AS BEGIN DECLARE @error int SET @error = 0 SET NOCOUNT ON; SELECT TOP 1 1 FROM dbo.[fn_WLC_GetParentChildRelationForVHD](@VHDId) vcr JOIN dbo.tbl_WLC_VDrive vd ON vcr.VHDId = vd.VHDId JOIN dbo.tbl_WLC_VObject vo ON vo.ObjectId = vd.ParentId JOIN dbo.tbl_WLC_VMInstance vi ON vo.ObjectId = vi.VMInstanceId WHERE vo.HostId = @HostId AND vo.ObjectId <> @VMId AND vi.RootVMInstanceId <> @VMId SET @error = @@ERROR SET NOCOUNT OFF RETURN @error END GO IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'prc_ADHC_HostDisk_GetByClusterDiskIdAndHostId') AND OBJECTPROPERTY(id, N'IsProcedure') = 1) DROP PROCEDURE dbo.prc_ADHC_HostDisk_GetByClusterDiskIdAndHostId GO CREATE PROCEDURE dbo.prc_ADHC_HostDisk_GetByClusterDiskIdAndHostId ( @ClusterDiskID guid, @HostID guid ) AS DECLARE @error int SET @error = 0 SET NOCOUNT ON SELECT [DiskID], [Signature], [UniqueID], [HostID], [LibraryServerID], [StArrayID], [LastUpdatedDateTime], [DeviceID], [Index], [Capacity], [IsPassThroughCapable], [IsSanAttached], [ClusterDiskID], [Location], [StorageLUNID], [SMLunId], [SMLunIdFormat], [SMLunIdNamespace], [SANType], [Bus], [Lun], [Target], [Port], [IsVHD], [StClassificationId] FROM dbo.tbl_ADHC_HostDisk WHERE [HostID] = @HostID AND [ClusterDiskID] = @ClusterDiskID SELECT @error = @@ERROR SET NOCOUNT OFF RETURN @error GO -- The stored procedure will be deleted after the OS table is updated IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[prc_IL_AddOSTemp]') AND type in (N'P', N'PC')) DROP PROCEDURE [dbo].[prc_IL_AddOSTemp] GO CREATE PROCEDURE [dbo].[prc_IL_AddOSTemp] @OSId GUID, @Name nvarchar(64), @Description nvarchar(max), @Edition int, @ProductType int, @Version nvarchar(32), @Architecture nvarchar(32), @OSFlags int, @VMWareGuestId nvarchar(32), @OSType int AS BEGIN DECLARE @error int SET @error = 0 SELECT * FROM dbo.tbl_IL_OS WHERE OSId = @OSId -- If the OS entry doesn't exist, add the entry. -- If it exists, update IF (@@ROWCOUNT = 0) BEGIN INSERT INTO dbo.tbl_IL_OS ( [OSId], [Name], [Description], [Edition], [ProductType], [Version], [Architecture], [OSFlags], [VMWareGuestId], [OSType] ) VALUES ( @OSId, @Name, @Description, @Edition, @ProductType, @Version, @Architecture, @OSFlags, @VMWareGuestId, @OSType ) END ELSE BEGIN UPDATE dbo.tbl_IL_OS SET [Name] = @Name, [Description] = @Description, [Edition] = @Edition, [ProductType] = @ProductType, [Version] = @Version, [Architecture] = @Architecture, [OSFlags] = @OSFlags, [VMWareGuestId] = @VMWareGuestId, [OSType] = @OSType WHERE OSId = @OSId END SET @error = @@ERROR RETURN @error END GO prc_IL_AddOSTemp 'A3281FA8-6633-4A1D-9AB2-6B563121EC8D', 'Ubuntu Linux 14.04 (32 bit)', 'Ubuntu Linux 14.04 (32 bit)', NULL, NULL, NULL, x86 , 0x1C, 'ubuntuGuest', 1 GO prc_IL_AddOSTemp '2AF8E4A1-05F0-444E-A96F-D4D5B86B5CC8', 'Ubuntu Linux 14.04 (64 bit)', 'Ubuntu Linux 14.04 (64 bit)', NULL, NULL, NULL, amd64 , 0x1C, 'ubuntu64Guest', 1 GO -- Delete the temporary stored procedure -- used to populate this table IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[prc_IL_AddOSTemp]') AND type in (N'P', N'PC')) DROP PROCEDURE [dbo].[prc_IL_AddOSTemp] GO /* script ends here */

Сначала я решил, что выполнение этого скрипта "зашито" в обновление, раз оно пришло из центра обновлений без каких-либо инструкций, но позднее обнаружил странную ошибку при попытке предоставить доступ определенному пользователю к шаблону служб. "В VMM возникло критическое исключение, создан отчет об исключении по адресу C:\ProgramData\VMMLogs\SCVMM.6b10258f-b72a-45b4-95ef-208d4f990b1f\report.txt.". По указанному адресу я нашел "Exception Message=Не удалось подключиться к базе данных VMM из-за общего сбоя базы данных. Убедитесь, что сервер SQL Server запущен и правильно настроен, и повторите операцию.".
Это натолкнуло меня на мысль о том, что надо все-таки попробовать применить скрипт из статьи базы знаний. И мысль была верной, после выполнения этого скрипта ошибка пропала.
Рекомендую прочитать KB, потому что там оговаривается еще один скользкий момент по поводу DHCP.
янв 31
Добавление SSD-кэш на windows 8

Около года назад мы решили использовать твердотельные накопители на компьютерах сотрудников в качестве основных и единственных. Производительность таких рабочих станций всех приятно удивила, и мы посчитали затраты оправданными. Но не так давно многим пользователям стало не хватать места на диске (мы используем SSD на 120ГБ). Приобретать SSD-диски большего объема - неоправданно дорого. Поэтому мы решили попробовать технологию Intel® Smart Response​​.  В описании технологии говорится, что скорость доступа к избранным приложениям и данным увеличивается в 3 раза и загрузка становится на 40% быстрее для Windows* 8 по сравнению системой на HDD. Итого по цене одного SSD на 120 ГБ мы должны получить  хранилище на 1 ТБ по производительности близкое к SSD. 

Системные требования​ Intel® RST: ​​

  • ​Intel® Z87, Q87, H87, Z77, Q77, H77 Express Chipset-based desktop board
  • Intel® Core™ Processor in the LGA 1155 or LGA1150 package
  • System BIOS with SATA mode set to RAID
  • Intel Rapid Storage Technology software 10.5 version release or later
  • Single hard disk drive or multiple drives in a single RAID volume
  • Solid-state drive (SSD) with a minimum capacity of 18.6GB
  • Operating system: Microsoft Windows 8* or Windows 7 (32-bit  and 64-bit editions)​

​Мы имеем:

  • Материнская плата: Asus H87-PLUS
  • Процессор: Intel Core i7 4770
  • ​SSD диск 60Gb Kingston KC300 Series
  • HDD диск 1 Tb WD Caviar Blue
  • Операционная система: Windows 8.1 Enterprise, Intel RST Driver 

​​Подключаем SSD cache.

После того, как установили SSD-диск в системник, необходимо в настройках BIOS переключить SATA Mode в RAID. Если просто изменить настройки BIOS, то получим синий экран, что вполне ожидаемо. Чтобы такого не произошло, нужно прибегнуть к уловкам, одна из которых - загрузиться в безопасном режиме (windows "подберет" подходящие драйверы): Пуск -> Выполнить -> msconfig, во вкладке "Загрузка" выбираем "Безопасный режим";

safetyMode.png 

либо следовать инструкциям ​​Microsoft.

При перезагрузке входим в BIOS и выбираем нужные настройки: SATA Mode SelectionRAID.SATAMode-RAID.png

Загружаемся в безопасном режиме, и перезагружаемся в обычном режиме (нужно убрать галочку «Безопасный режим» в msconfig).​

Теперь устанавливаем ​Intel® Rapid Storage Technology (Intel® RST) RAID Driver, включая Intel Control Center:

IntelControlCenter.png 

Следуем указаниям мастера установки, в конце нам будет предложено перезагрузиться.

После перезагрузки запускаем IntelRST. Во вкладке «Производительность» включаем ускорение:

Accelerate1.png 

В следующем окне необходимо выбрать параметры ускорения.
В качестве кэш-памяти  выбираем весь SSD-диск.

Что касается режимов ускорения:
Расширенный режим «Enhanced» является более безопасным. В нем все записи система производит «сквозь» SSD-накопитель на жесткий диск. При этом скорость записи ограничивается самым медленным устройством из этой пары, которым должен быть жесткий диск. При повторном обращении к информации чтение производится с SSD-диска, сокращая, таким образом, время чтения. Также в этом режиме можно отсоединять SSD-диск без предварительных мер по сохранению данных.
Максимальный режим «Maximized» имеет другой алгоритм функционирования – запись изначально производится на SSD-диск, а через время переносится на основной - HDD. За счет этого достигается прирост производительности. Но в этом режиме, прежде чем отсоединить SSD-диск, необходимо выключить ускорение, и существует большая вероятность потери информации из-за, например, аварийного отключения питания. Но наши эксперименты с отключением питания потерю информации не выявили.
Поэтому мы выбираем Максимальный режим.

accelerationMode1.png
 

Вот и все - SSD кэш готов к использованию.

accelerated1.png
 

Прирост производительности заметен "на глаз" только после нескольких перезагрузок системы.

Но хочу предостеречь Вас от перезагрузки системы непосредственно после включения ускорения - при этом у нас ничего не получалось сначала (no bootable device), хотя все делали по инструкции. Лишь с третьей попытки все заработало как должно (после включения ускорения компьютер использовался некоторое время без перезагрузки).

Хотелось бы, конечно, привести некие количественные показатели прироста производительности, но не в этот раз.


 

дек 03
Эффективная работа в Windows 8.1

​Небольшой мастер класс о приёмах эффективной работы в новой ОС Windows

 
ноя 08
Ошибка после обновления TFS 2012 до TFS 2013

Обновление TFS до 2013 прошло, в целом, штатно.

Стоит лишь обратить внимание на тот факт, что SQL Server 2008 R2 более не поддерживается и даже на 2012 версию придется установить SP1 и CU2 for SP1. При обновлении SQL server переходит в режим обслуживания и не доступен.

В веб-интерфейсе TFS 2013 после обновления был обнаружен странный баг: при попытке отобразить changesets на вкладке CODE появлялась ошибка "Error in the application". Проблема решается выполнением следующего скрипта, который меняет некий параметр в базе данных коллекции TFS:

IF EXISTS ( SELECT *
            FROM    sys.extended_properties
            WHERE   name = 'TFS_SERVICE_LEVEL'
                    AND value = 'Dev12.M53') 
   AND
   EXISTS ( SELECT *
            FROM    sys.extended_properties
            WHERE   name = 'TFS_DATABASE_TYPE'
                    AND value = 'Collection')
BEGIN
    EXEC prc_SetServiceVersion 'Discussion', 6
END
 
Этот скрипт был опубликован на msdn-форуме сотрудником TFS Team.
http://social.msdn.microsoft.com/Forums/vstudio/en-US/c8f03b2c-cc58-48c5-b95d-e6ea4bbd1535/view-history-error-in-the-application?forum=tfsversioncontrol

 

апр 04
Перенос базы данных из SQL Server 2012 в SQL Server 2008

​Возникла необходимость откатиться до 2008 R2 версии сервера для одного капризного продукта. Бекап, сделанный в 2012 версии сервера, не восстанавливается в 2008, детач/аттач базы выдает ошибку.

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

Для создания скрипта, содержащего схему и данные, необходимо в SQL Management studio выбрать в контекстном меню базы данных Tasks - Generate scripts...

В появившемся окне после приветствия выбрать "script entire database and all database objects", далее нажать кнопку Advanced и в появившемся списке опций поменять параметры "Types of data to script" и "Script for Server Version" на "Schema and data" и "SQL Server 2008 R2" соответственно: 

20130404111043568.png 

После этого в указанном расположении появится файл со скриптом. Его размер и время создания, разумеется, зависят от размера базы.

После того, как операция завершится, нужно выполнить этот скрипт на конечном сервере, однако сделать это через management studio не представляется возможным в случае сколько-нибудь большого файла (мой был около 250 Мб). Поэтому нужно открыть командную строку (я на всякий случай запустил её с повышенными правами) и выполнить команду:

C:\Windows\system32>sqlcmd -S <servername> -i C:\<path>\script.sql -o out.log

После этой небольшой магии на сервере <servername> появится новая база данных с именем исходной и конечно же исходными данными.

Все операции делались мною с "третьего" компьютера, на котором установлена management stuido и от имени пользователя, который имеет необходимые права для доступа к обоим серверам.

Ссылки:

http://superuser.com/a/469597

http://stackoverflow.com/a/431915

мар 26
Дело об упавших билд-серверах

В этот раз без прелюдий.

После обновления ​TFS до Update1 начали отпадать билд-серверы с невнятной ошибкой про отсутствие доступа, который есть. В ходе длительных экзекуций причину установить так и не удалось, однако мне на помощь пришел иностранный коллега, который догадался и не поленился проанализировать логи IIS и установить, что причиной такого поведения является привязка сайта tfs к нескольким именам хоста и портам.

Соответственно, проблема с билд-серверами устраняется вместе с устранением лишних привязок. Вопрос о том, как же у меня это работало до обновления TFS остается открытым, потому как я банально не помню настроек IIS, которые при обновлении были варварски переписаны новыми.

Спасибо MrHinsh из этого блога http://blog.hinshelwood.com/tfs-2012-issue-stuck-builds-in-team-foundation-build-with-no-build-number/ 

1 - 10Далее
Об этом блоге
Наиболее интересные случаи из практики администрирования