Выбор компонентов в MS Office 2016

В последнее время у некоторых крупных производителей ПО пошла мода считать себя умнее пользователей. В частности Microsoft в последнем выпуске Office 2016 не даёт возможности в установщике выбрать устанавливаемые компоненты: есть всего одна кнопка Установить, нажатие которой ставит полный комплект. Это, конечно, удобно ряду пользователей, кому больше одной кнопки и не нужно, однако, что делать если пользователю не нужны разные One Note, Publisher или они не пользуются Outlook? Или по ряду причин хотят сохранить место на системном жёстком диске или просто не любят ничего лишнего.

Решение, к счастью, есть. Не совсем тривиальное, но рабочее. Реализуем его на стандартном пакете Home & Business.

Для кастомной установки сначала качаем Office 2016 Deployment Tool, помещаем его в пустую директорию, которая будет в итоге директорией с нашим дистрибутивом. Получаем в итоге 2 файла: setup.exe, configuration.xml. Первый это, очевидно, сам установщик, а второй файл конфигурации, по которому этот установщик работает. Правим его согласно первоисточнику, например, следующим образом:

















В этой конфигурации мы явно указали продукт, разрядность, язык и исключили компоненты, которые не нужны (в том числе и те, которых нет в выбранной поставке. Так, на всякий случай). Далее запускаем закачку дистрибутивов выбранных компонентов

setup.exe /download configuration.xml

И после закачки запускаем саму установку по заданной конфигурации

setup.exe /configure configuration.xml

Бинго! Поставили только то, что нужно.

Бэкапы windows-шар через smbfs

Важное преимущество Linux, BSD и других никсов — наличие очень мощных базовых утилиты, с помощью которых можно автоматизировать многие необходимые задачи. В частности, ssh, rsync позволяют очень удобно и надёжно создавать, передавать (в том числе и за многие километры по интернету) и всячески управлять бэкапами, а с помощью архиваторов их можно и сжимать. Windows, к сожалению, не обладает таким функционалом "из коробки", да и сторонние решения не "из коробки" не всегда подходят по ряду параметров. Поэтому, логично организовать сервер резервных копий даже в Win-сети на основе Linux и стягивать на него в плановое время данные для бэкапа. Посмотрим, как это можно не слишком умудрённо сделать.

Будем изначально подходить наиболее экономным способом: с наименьшей конфигурацией исходных машин. Для этого монтируем нужную шару, делаем копию, размонтируем. Монтируем с помощью mkfs.cifs из пакета cifs-utils. Если на машину можно зайти анонимно, так и заходим, с помощью соответствующей опции

mount -t cifs //192.168.10.99/Data $data_dir -o user=guest,guest

Можно, конечно, добавить шару в fstab и держать постоянно смонтированной, но это скорее излишне, поэтому будем её монтировать только на время бэкапа. Также, на случай возможных ошибок, выбираем директорию каждый раз новую в /tmp, получить временную директорию можно

mktemp -d

Копию будем делать дифференциальную на основе жёстких ссылок. rsync позволяет делать делать hard-linked копии сам, на основе предыдущей копии, или их можно делать отдельно, а затем заменять новые файлы. Воспользуемся вторым способом: в случае обрыва бэкапа мы получим не обновлённый, но полный бэкап, который обновится в следующий раз. В первом случае его придётся загружать полностью, что не всегда разумно если канал тонкий.

С учётом всего вышеперечисленного пишем скрипт

#!/bin/sh

softmkdir() {
	if [ ! -d "$1" ] ; then
		mkdir "$1"
		chmod 0750 "$1"
	fi
}

# SETTINGS
host=`hostname -s`
backup_dir=/backup/$host/data_rsync
len=90

softmkdir "$backup_dir"

tmpname=new
tmp_dir="$backup_dir/$tmpname"
zero_dir="$backup_dir/d`printf "%02d" 0`"
prev_dir="$backup_dir/d`printf "%02d" 1`"
last_dir="$backup_dir/d`printf "%02d" $len`"

date=`date`
echo "================================="
echo "Starting backup: $date."

if [ -d "$zero_dir" ]; then
	echo "Rotating directories up to length of $len."

	# removing last directory
	if [ -d "$last_dir" ]; then
		rm -rf "$last_dir"
	fi

	# rotating
	for i in $(seq  $len -1 0); do
		src="$backup_dir/d`printf "%02d" $i`"
		if [ -d "$src" ]; then
			mv "$src" "$backup_dir/d`printf "%02d" $(($i+1))`"
		fi
	done
fi

if [ ! -d "$tmp_dir" ] ; then
	if [ -d "$prev_dir" ] ; then
		echo "Found previous backup. Making hard-linked copy."
		cp -al "$prev_dir" "$tmp_dir"
		echo "Hard-linked copy done."
		test -d "$tmp_dir" && touch "$tmp_dir"
	else
		echo "Previous backup not found. Creating init backup."
		softmkdir "$tmp_dir"
	fi
else
	echo "Found temporary directory (not finished last backup), resuming it."
fi

data_dir=`mktemp -d`
mount -t cifs //192.168.10.24/Data $data_dir -o user=guest,guest

echo "Starting rsync..."
rsync -azK --delete --ignore-errors --stats --numeric-ids $1 $data_dir/ "$tmp_dir/Data"

test -d "$tmp_dir" && touch "$tmp_dir"
echo "Rsync done."

# moving temporary to latest
echo "Moving temporary dir name to normal backup name."
mv "$tmp_dir" "$zero_dir"

umount $data_dir
rm -d $data_dir

echo "Backup finished: $date."
echo "================================="
echo ""

Проверяем, что всё работает корректно и добавляем в cron.

Уменьшение размера образов qemu

Linux в связке с qemu является отличной платформой для виртуализации, в том числе Windows-систем. Ключевой особенностью виртуализации в случае "инородных" систем является использование под эту систему файла-образа или отдельного блочного устройства. И то и другое обычно занимает достаточно много места. Попробуем минимизировать используемое место в этом случае.

Среди поддерживаемых qemu форматов образов есть как обычные бинарные образы (img), так и сжатые и несжатые qcow/qcow2. Последний формат в сжатом варианте показывает очень хорошие результаты по использованию места: его образы занимают мало места и при этом размер "внутреннего" жесткого диска в виртуальной системе может быть очень большим. Использоавать этот формат можно изначально, при создании виртуальной машины с помощью qemu-img, или конвертацией образа другого формата в qcow2

qemu-img convert -O qcow2 -c win10.img win10.qcow2

Сжатие в формате qcow2 используется в режиме "только для чтения", т.е. если что-то из образа переписывается, то перезапись происходит уже в несжатом формате. Получается, что сжатой будет статичная часть системы и данных в образе, которые в зависимости от задачи вируталки могут занимать основную часть данных. Для таких машин это формат будет наиболее подходящим.
Руководство qemu-img также предупреждает, что при использовании сжатия несколько уменьшается производительность. Однако, субъективно разницы между несжатым и сжатым форматом мне заметить не удалось.

При конвертации в qcow2 и сжатии следует заранее позаботиться о "чистоте" образа: занулить всё неиспользуемое на нём пространство. В Руководстве Proxmox подробно описываются способы, которыми это можно сделать. Наиболее короткий — очистить диск с помощью майкросовтовской утилиты sdelete, например:

sdelete -z C:

В последней версии утилиты 2.0 есть баг — она зависает на 100%. В этом случае имеет смысл использовать более старую версию 1.6. Есть также вариант использовать графическую Eraser, но это обычно более длинный путь.

В ходе использования образ понемного увеличивается в размере. После длительного использования образ можно сократить в размере тем же самым способом: занулив свободное места и переконвертацией его в qemu-img:

qemu-img convert -O qcow2 -c win9.qcow2_backup win9.qcow2

Естественно, как и перед очисткой образа, так и его пережатием крайне желательно сделать бэкап.

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

Отключение телеметрии в Windows 10

Наконец-то нашёл хорошую и вменяемую утилиту для отключения телеметрии, шпионства и сбора данных в Windows 10. Работает также в версиях 7 и 8.x и поддерживается автором. Из решающего задачу приватности в windows аналогичного софта, эта утилита одна из лучших.

Samba >=4.2 и Windows XP

С выходом самбы 4.2 поменялись настройки безопасности, которые идут по умолчанию из коробки. В частности, в дефолтной версии отключена поддержка старого протокола аутентификации для защиты от MTM-атак (человек по середине).
В результате этого старые ОС (Windows XP и похожего срока древности) не могут аутентифицироваться и работать с windows-шарами под samba. Тем не менее, кое-где ещё используются такие динозавры, поэтому нужно включить в самбе старый протокол и не бояться MTM.

Вот что пишут в apt-listchanges к пакету:

Suggested further improvements after patching:

It is recommended that administrators set these additional options,
if compatible with their network environment:

server signing = mandatory
ntlm auth = no

Without "server signing = mandatory", Man in the Middle attacks
are still possible against our file server and
classic/NT4-like/Samba3 Domain controller. (It is now enforced on
Samba’s AD DC.) Note that this has heavy impact on the file server
performance, so you need to decide between performance and
security. These Man in the Middle attacks for smb file servers are
well known for decades.

Without "ntlm auth = no", there may still be clients not using
NTLMv2, and these observed passwords may be brute-forced easily using
cloud-computing resources or rainbow tables.

Из некоторого анализа новых фич и изменённых настроек становится ясно, что включается поддержка нужного протокола одной строчкой global-секции:

        ntlm auth = no

которая позволяет аутентифицироваться и работать старым ОС, при этом понижая общую безопасность.

Как в MS SQL Server уменьшить размер логов

В процессе работы с базами данных MS SQL с полным логом транзаций через некоторое время этот лог разрастается до внушительных размеров и начинает занимать места больше, чем сама база данных. Есть несколько путей очистки этого лога.

1. Короткий и скорее нерекомендуемый путь

backup log [dbname] TO DISK='NUL'
go
DBCC SHRINKDATABASE ([dbname], 10, TRUNCATEONLY)
go

2. Более длинный, но скорее более надёжный способ (из обсуждения)

USE dbname;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE dbname
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (2, 1);  -- here 2 is the file ID for trasaction log file,you can also mention the log file name (dbname_log)
GO
-- Reset the database recovery model.
ALTER DATABASE dbname
SET RECOVERY FULL;
GO

PS: Естественно, экспериментировать с БД и обрезать логи необходимо после полного бэкапа БД заранее.

Windows GodMode

В Windows версий выше 6.0 есть отличный способ получить доступ к огромному списку настроек из одного окна. Для этого создаем папку с именем

GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}

Часть названия до точки может быть любой, а после точки — это GUID соответствующей фичи. После создания "папки" у неё меняется иконка и она ведёт в очень удобную управлялку.

Причём этот способ не является каким-то волшебством, его механизм описан очень давно. Похожим образом можно создать "ярлык" для многих других управлялок, что подробно описано в справке Майкрософта. Интересно, что в этой справке нет GUID для вышеупомянутой панели, несмотря на то, что она даже успела засветиться в Википедии.

Включение telnet в Windows 7

Майкрософт, к сожалению, продолжает свою давнюю традицию выключения из системы полезных утилит, а включить их бывает не всегда быстро. В семерке такому изгнанию подвергся стародавний терминальный клиент telnet, поэтому если в коммандной строке наберем соответствующую команду, то получим ответ, что telnet "не является внутренней или внешней командой, исполняемой программой или пакетным файлом".

Ясно, что всегда можно найти (и часто более удобную) альтернативу, но иногда предпочтительнее нативный клиент. Как его включить? Это возможно с помощью DISM. Для этого запускаем консоль (cmd) с правами администратора и выполняем в ней:

dism /online /Enable-Feature /FeatureName:TelnetClient

В результате, спустя некоторое и весьма продолжительное время и зачем-то потребовав перезагрузку (!) клиент ставится.

Отключение рекламы в Skype

Последние версии скайпа не только очень тяжёлые и тормозные, но и качают рекламу. Наиболее простой способ устранить это — отключить корректное разрешение имён хостов, к которым скайп обращается за рекламой. Список таких хостов легко гуглится, чтобы отключить обращение к ним прописываем в местном хостс (находится в %SystemRoot%\system32\drivers\etc\hosts) следующие строки:

127.0.0.1 rad.msn.com
127.0.0.1 apps.skype.com
127.0.0.1 api.skype.com
127.0.0.1 static.skypeassets.com
127.0.0.1 adriver.ru
127.0.0.1 devads.skypeassets.net
127.0.0.1 devapps.skype.net
127.0.0.1 qawww.skypeassets.net
127.0.0.1 qaapi.skype.net
127.0.0.1 preads.skypeassets.net
127.0.0.1 preapps.skype.net
127.0.0.1 serving.plexop.net
127.0.0.1 preg.bforex.com
127.0.0.1 ads1.msads.net
127.0.0.1 flex.msn.com

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

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

BiPrint под Windows 8.1 x64

Есть такая древняя утилита для печати двумерного штрих-кода на платежках BiPrint. К сожалению, утилита очень редко обновляется и, что ещё хуже, — всё ещё используется некоторыми российскими банками.

Проблема возникает при попытке установке BiPrint на новые операционные системы. В частности, на Windows 8.1 x64. Кто пытался поставить BiPrint, знает, что последний требует файл ep200.gpd из драйверов старого Epson-принтера. Этот файл легко найти и скачать, однако, он не подписан Microsoft и нормальным образом не добавляется в систему.

Тем не менее, существует вполне рабочее альтернативное решение. Если коротко, то решается проблема следующим образом:

  1. Качаются подписанные Майкрософтом драйвера для принтера Epson PLQ-20 для ОС Windows 7 x64 и этот принтер добавляется в систему на какой-нибудь LPT-порт.
  2. Качается бипринт-клиент для Windows 7 и терминального сервера. Софтина устанавливается и в настройках указывается использование скачанных выше драйверов.
  3. В BiPrint выбирается любой из реальных принтеров и если вышеописанные шаги выполнены правильно, все работает.

ssh/scp под Windows

Несколько решена проблема с доступом ssh/scp из под Windows. Cофтина позволяет монтировать ssh как логический том (sshfs). С её помощью может получиться неплохое решение для удалённых бэкапов из Windows под любые никсы. Жаль, что пока нет решения под Windows 8 и серверную 2012.

Win7 RDP multiuser

Не работает удаленный рабочий стол на несколько пользователей после обновлений ноября 2014?
Сносим обновления KB2984972, KB3003743. После этого терминал снова отлично работает.

Резервные копии в Windows по сети

Используемые средства

К сожалению, Windows по сравнению с *nix-системами имеет очень слабый функционал для подготовки и копирования бэкапов. В последнее время имеется тенденция к улучшению (PowerShell), однако, полезных утилит все равно недостаточно. Обычные Windows-утилиты copy/xcopy очень плохо работают на большом количестве файлов. В интернете можно найти "продвинутую" версию xcopy под названием robocopy, именно её мы и будем использовать.

Полные бэкапы

Будем размещать резервные копии на сервере srv-bak. Копировать будем в сетевую шару \\srv-bak\bak\srv01, где srv01 — директория с именем сервера на бэкапном. Таким образом в одной директории будут храниться бэкапы с разных серверов.
На сервере с резервными копиями для каждой из них будем создавать директорию с текущей датой в качестве имени. Для удобства поместим исходные пути, которые нужно забэкапить, в файлик D:\backup\dirs.txt. Переносим всё это дело "на клавиатуру" и получаем такой скрипт:

set backupdir=\\srv-bak\bak\srv01
IF NOT EXIST %backupdir% (
	mkdir %backupdir%
)

set d=%date:~0,2%
set m=%date:~3,2%
set y=%date:~6,4%
set ndate=%y%%m%%d%

set dirsfile=D:\backup\dirs.txt

set dstpath=%backupdir%\%ndate%
IF NOT EXIST %dstpath% (
	mkdir %dstpath%
)

for /f "eol=; tokens=1 delims=" %%i in (%dirsfile%) do (
	mkdir "%dstpath%%%~pi%%~ni"
	robocopy "%%~di%%~pi%%~ni" "%dstpath%%%~pi%%~ni" /E /ZB /NP
)

Чтобы всё работало автоматически, добавляем скрипт в планировщик. Таким (простым!) способом можно бэкапить достаточно большие объемы. Единственный, но существенный, наблюдаемый баг — если какой-то из копируемых файлов занят, скрипт отработает некорректно.

Инкрементные/дифференциальные бэкапы

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

set backupdir=\\srv-bak\bak\srv01
IF NOT EXIST %backupdir% (
	mkdir %backupdir%
)

set d=%date:~0,2%
set m=%date:~3,2%
set y=%date:~6,4%
set ndate=%y%%m%%d%

if "%d%"=="01" (
	set dstpath=%backupdir%\%ndate%
) ELSE (
	set dstpath=%backupdir%\d%ndate%
)

IF NOT EXIST %dstpath% (
	mkdir %dstpath%
)

set /A prev=1%d%-100-1
if %prev% LSS 10 (
	set prev=0%prev%
)

set dirsfile=D:\backup\dirs.txt

if "%d%"=="01" (
	for /f "eol=; tokens=1 delims=" %%i in (%dirsfile%) do (
		:: xcopy "%%~di%%~pi%%~ni" "%dstpath%%%~pi%%~ni\" /C /E /H /Y
		mkdir "%dstpath%%%~pi%%~ni"
		robocopy "%%~di%%~pi%%~ni" "%dstpath%%%~pi%%~ni" /E /ZB /NP
	)
) ELSE (
	for /f "eol=; tokens=1 delims=" %%i in (%dirsfile%) do (
		:: xcopy "%%~di%%~pi%%~ni" "%dstpath%%%~pi%%~ni\" /D:%m%-%prev%-%y% /C /S /H /Y
		mkdir "%dstpath%%%~pi%%~ni"
		robocopy "%%~di%%~pi%%~ni" "%dstpath%%%~pi%%~ni" /MAXAGE:2 /S /ZB /NP
		rmdir "%dstpath%%%~pi%%~ni"
	)
)

IF EXIST %dstpath% (
	rmdir %dstpath%
)

Заключительные замечания

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

find -mindepth 2 -maxdepth 2 -type d -ctime +7 -execdir /usr/local/bin/tar_and_remove.sh "{}" \;

или

find -mindepth 2 -maxdepth 2 -type d -ctime +7 -execdir rar a -t -m5 -r -rr1 -df -inul "{}.rar" "{}" \; &> /dev/null

Кроме этого, с никсового сервера эти бэкапы очень удобно копировать с помощью ssh/scp/rsync.

Быстрое удаление служб Windows

В Windows легко удалить службу с помощью командной строки. Для этого:

  1. Проверяем статус службы по имени с помощью команды sc:
    sc query UselessServiceName

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

  2. Останавливаем службу, если она запущена:
    sc stop UselessServiceName
  3. Удаляем службу окончательно:
    sc delete UselessServiceName

PS: Часто полезно сделать бэкап (сохраниться) перед удалением службы. Для этого надо экспортировать ветку реестра

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\[имя_службы]

Правда, в этом случае легче удалить службу удалением соответствующей этой службе ветки реестра.

Безопасность Skype

Так уж повелось, что я не доверяю Skype и некоторым новомодным браузерам: рассматриваю их как разновидность неопасных троянских коней. Может, конечно, они плохого ничего и не делают, но свои данные я им открывать не хочу. Для огораживания подобных подозрительных приложений отлично подходит runas от другого непривелигерованного пользователя. Например:

%windir%\system32\runas.exe /profile /user:another_user "C:\Program Files\Skype\Phone\Skype.exe"

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