суббота, 23 января 2010 г.

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

Введение

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

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

Немного предыстории. В связи с нестабильной работой фотоальбома Windows на терминальных серверах, было принято решение об использовании альтернативного программного обеспечения для просмотра изображений. На серверах уже был установлен Microsoft Office 2007. Однако, Microsoft Office Picture Manager не подходил из-за отсутствия поддержки просмотра многостраничных tif-файлов. Кроме того, при попытке печати из Microsoft Office Picture Manager и фотоальбома Windows возникала загадочная ошибка о недостатке оперативной памяти.

error

Замена принтера по умолчанию и настройка его параметров не помогали. Удаление профиля, добавление прав, удаление и повторная установка компонента "Возможности рабочего стола" также не смогли решить проблему. В результате было принято решение использовать альтернативное программное обеспечение.

В качестве такового было выбрано Imagine

http://en.wikipedia.org/wiki/Imagine_(graphics_software)

Из его плюсов можно отметить:

· низкие требования к ресурсам сервера,

· отсутствие предпросмотра при печати изображений (на терминальных серверах это приводит к излишней трате трафика),

· русскоязычный интерфейс,

· поддержку просмотра многостраничных tif,

· интеграция с проводником Windows.

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

Смена ассоциаций

Стандартными утилитами для выполнения подобного рода операций являются:

assoc и ftype.

Для смены ассоциации для открытия файлов с расширением .tif достаточно выполнить следующие команды:

assoc .tif=Imagine.Document

ftype Imagine.Document="E:\Program Files\Imagine\Imagine.exe" "%1"

вместо Imagine.Document можно задать любой другой новый тип файлов.

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

http://blogs.technet.com/heyscriptingguy/archive/2009/03/27/quick-hits-friday-the-scripting-guys-respond-to-a-bunch-of-questions-03-27-09.aspx

в которой рекомендовалось создать vbs-скрипт подобного содержания:

Set objShell = WScript.CreateObject("WScript.Shell")

objShell.Run("%comspec% /K ftype TIFImage.Document =""C:\Program Files\MSPVIEW.exe"" ""%1"""), 1, True

Там же приводилась ссылка на официальную документацию:

http://technet.microsoft.com/ru-ru/library/ee156605(en-us).aspx

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

В качестве еще одного способа моей задачи предлагалось использование Group Policy Prefferences. Однако этот подход меня смутил, т.к. там ассоциации для файла создавались в разделе конфигурации компьютера и требовали указания массы параметров.

В итоге, решил попробовать сменить ассоциации через реестр. Для этого запустил Process Monitor и с его помощью отследил изменения, производимые в реестре. Они происходили в двух местах.

В ветке: HKEY_CURRENT_USER\Software\Classes\Applications создавался куст реестра, соответствующий Imagine, а ветке HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.tif

прописывалось, что файл *.tif надо открывать с помощью описанного выше приложения.

Собрав все изменения в один reg-файл, проверил его работу по изменению ассоциации. Для этого вручную выбрал Microsoft Office Picture Manager для открытия данного типа файлов и импортировал созданный ранее reg-файл. В результате, получил ошибку о том, что не все данные были импортированы.

error2

Причиной подобной ошибки послужил запрет на изменение значений ветки реестра HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.tif\UserChoice.

Этот запрет автоматически создавался системой после "ручного" выбора программы для открытия tif-файлов.

registry

С другой стороны, было возможно удалить вышестоящую ветку, чем я и воспользовался. Для этого в reg-файл добавил строчку

[-HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.tif\UserChoice]

После этого осталось написать скрипт, который проверял бы в реестре значение нужного ключа и при необходимости импортировал созданный reg-файл. Скрипт позаимствовал из форумов Technet

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

В заключении прилагаю содержимое reg-файла и vbs-скрипта

imagine.reg:

Windows Registry Editor Version 5.00

[-HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.tif\UserChoice]

[HKEY_CURRENT_USER\Software\Classes\Applications\Imagine.exe]

[HKEY_CURRENT_USER\Software\Classes\Applications\Imagine.exe\shell]

[HKEY_CURRENT_USER\Software\Classes\Applications\Imagine.exe\shell\open]

[HKEY_CURRENT_USER\Software\Classes\Applications\Imagine.exe\shell\open\command]

@="\"E:\\Program Files\\Imagine\\Imagine.exe\" \"%1\""

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.tif]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.tif\OpenWithList]

"a"="Imagine.exe"

"MRUList"="a"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.tif\OpenWithProgids]

"TIFImage.Document"=hex(0):

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.tif\UserChoice]

"Progid"="Applications\\Imagine.exe"

imagine.vbs:

Dim i,Shell,KeyValue,Keys(1,4)

set Shell = WScript.CreateObject("WScript.Shell")

Keys(0,0)="Progid"

Keys(0,1)="HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.tif\UserChoice\"

Keys(0,2)="Applications\Imagine.exe"

Keys(0,3)="REG_SZ"

On Error Resume Next

For i=0 To UBOUND(Keys)-1

Shell.RegRead(Keys(i,1)&Keys(i,0))

if Err.Source="WshShell.RegRead" then

Set objShell = CreateObject("Wscript.Shell")

objShell.Run ("regedit /s E:\Program Files\Imagine\imagine.reg")

KeyValue=Keys(i,2)

else

KeyValue= Shell.RegRead(Keys(i,1)&"\"&Keys(i,0))

end if

Err.Clear

If KeyValue<>Keys(i,2) then

Set objShell = CreateObject("Wscript.Shell")

objShell.Run ("regedit /s E:\Program Files\Imagine\imagine.reg")

End If

Next

Комментариев нет:

Отправить комментарий