ИВАН КОРОБКО
Создаём персональный набор ярлыков
для каждого пользователя в папке «Мой Компьютер»
Представьте себе: вы входите в папку «Мой Компьютер» и видите в ней кроме дисков ярлыки к приложениям, используемым в сети! О том, как реализовать эту идею, и пойдет речь.
В компьютерных сетях крупных организаций используется большое количество сетевых приложений. Задача системного администратора – обеспечить к ним удобный доступ. Как правило, для этого создают папку, обеспечивают к ней доступ из сети. Внутри нее создают ярлыки, ссылающиеся на сетевые приложения. С помощью сценария регистрации пользователей в сети подключают каждому сотруднику эту папку. В таком случае сотрудник будет иметь доступ ко всем сетевым приложениям. С точки зрения безопасности и производительности труда он должен видеть только те ярлыки сетевых приложений, с которыми работает.
Одно из возможных решений – создать несколько сетевых папок и подключать их в зависимости от должностных обязанностей сотрудника. Все это приводит к созданию нескольких сетевых дисков и увеличению затрат на администрирование.
Создав ярлыки пользователей в папке «Мой компьютер», вы избавитесь от нескольких лишних сетевых дисков, упростите доступ к ресурсам. С точки зрения безопасности это решение также предпочтительно: сотрудник не сможет увидеть путь к приложению, удалить ярлык.
Воспользовавшись группами безопасности в Active Directory можно создать для каждого пользователя индивидуальный набор ярлыков (см. рис. 1). Естественно, домен в этом случае построен на основе Windows 2000/2003 Server. В противном случае данное решение сложно реализуемо.
Рисунок 1. Внешний вид папки «Мой Компьютер»
Сразу хотелось бы отметиьть: в статье описываются подход, концепция. Несмотря на то что в ней приведены листинги и рассмотрены нюансы, статья не должна рассматриваться как пошаговая инструкция.
Реестр
Рассмотрим подробнее алгоритм создания ярлыка. Процедура описания ярлыка состоит из двух частей. В первой части описывается местоположение объекта, а во второй – его свойства.
Для описания местоположения объекта (папка «Мой компьютер») достаточно создать в ветви реестра: HKLMSoftwareMicrosoftCurrentVersionExplorerMyComputerNameSpace папку. Имя папки – уникальный CLSID, например, {C7AF0CFE-D0C4-11DC-B55C-F6B756D89593}. Для его генерации можно воспользоваться стандартной утилитой uuidgen.exe, входящей в состав Microsoft SDK. После установки пакета утилита находится в папке C:Program FilesMicrosoft SDKBin.
Чтобы описать свойства объекта (ярлыка или папки), необходимо в ветви HCCRCLSID создать папку. Ее имя – сгенерированный CLSID, который был использован в ветви HKLM. Внутренняя структура подпапок, которую необходимо воспроизвести, приведена на рис. 2.
Рисунок 2. Структура папок в HCCRCLSID{GUID}
Назначение папок, содержащиеся в них ключи и соответствующие им значения описаны в таблице.
Листинг 1. Создание ярлыка в папке «Мой Компьютер». REG-файл
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\CLSID\{C7AF0CFE-D0C4-11DC-B55C-F6B756D89593}]
@="Карта г.Москвы"
"infotip"="Карта г.Москвы"
[HKEY_CLASSES_ROOT\CLSID\{C7AF0CFE-D0C4-11DC-B55C-F6B756D89593}\defaulticon]
@="\\\\Server\Folder$\\\MoscowMap\\Btk2007.exe,0"
[HKEY_CLASSES_ROOT\CLSID\{C7AF0CFE-D0C4-11DC-B55C-F6B756D89593}\shell\open\command]
@="\\\\Server\Folder$\\\MoscowMap\\Btk2007.exe"
[HKEY_CLASSES_ROOT\CLSID\{C7AF0CFE-D0C4-11DC-B55C-F6B756D89593}\ShellFolder]
"Attributes"=hex:00,01,00,a0
HKLM\Software\Microsoft\CurrentVersion\Explorer\MyComputer\NameSpace\{C7AF0CFE-D0C4-11DC-B55C-F6B756D89593}
Итак, ярлык создан. Рассмотрим механизм создания персонального набора ярлыков для каждого пользователя.
Описание свойств ярлыка в HCCRCLSID
Папка реестра
|
Ключ
|
Тип данных
|
Значение
|
Комментарий
|
HCCRCLSID
|
@
|
REG_SZ
|
Карта г. Москвы
|
Название ярлыка, отображаемое в папке «Мой Компьютер»
|
HCCRCLSID
|
infotip
|
REG_SZ
|
Карта г.Москвы за ноябрь 2007 года
|
Подробное описание ярлыка. Отображается, если навести курсор на ярлык и подождать 1-2 секунды (см. рис. 1, указано красной стрелкой)
|
HCCRCLSIDdefaulticon
|
@
|
REG_SZ
|
ServerFolder$MoscowMapBtk2007.exe,0
или ServerFolder$MoscowMapMap.ico
|
Путь к иконке, которую увидит пользователь
|
HCCRCLSIDdefaulticon shellopencommand
|
@
|
REG_SZ
|
Server Folder$MoscowMap Btk2007.exe
|
Путь к приложению, которое будет запускать при нажатии на иконку
|
HCCRCLSIDshellfolder
|
Attributes
|
REG_BINARY
|
hex:00,01,00,a0
|
Благодаря этому ключу созданный ярлык нельзя переименовать, удалить и т. д.
|
Способы внедрения
Для успешной работы сценария регистрации пользователей сети необходимы административные привилегии, поскольку рядовой пользователь не имеет прав делать изменения в таких ветвях реестра, как HKLM и HCCR. Существует несколько способов решения данной проблемы. Первый – запускать сценарий с помощью командного файла, внутри которого команда RunAs. Такое решение небезопасно, поскольку имя и пароль учетной записи с административными привилегиями будет храниться в общедоступном месте – папке Netlogon. Это серьезная брешь в системе с точки зрения безопасности. Второй способ – запускать веб-сайт на основе ASP.NET в скрытом режиме с помощью сценария, а создавая его, воспользоваться преимуществом механизма представлений (имперсонализации). Таким образом, не публикуя в общедоступном месте имя и пароль административной учетной записи, можно достигнуть требуемого эффекта.
Включение режима представлений осуществляется в файле web.config, а для веб-cайта необходимо создать пул в IIS 6 под управлением Windows 2003 Server.
Для создания веб-сайта лучше всего воспользоваться Microsoft Visual Studio 2005. Язык можно выбрать любой. Для создания веб-cайта я выбрал VB.NET.
Персональный набор ярлыков для пользователя
В Active Directory есть несколько групп, каждая из которых соответствует какому-либо ресурсу. В свойствах этой группы описаны характеристики ярлыка (см. рис. 3). При регистрации пользователя в сети в сценарии, по префиксу в названии (mc$_), определяется список групп, членами которых является входящий в сеть пользователь. Затем считываются нужные параметры группы, и осуществляется запись данных в реестр. Таким образом, пользователь получает индивидуальный набор ярлыков. Обратите внимание, что при этом название группы может быть произвольным. Важно, чтобы в названии группы был префикс.
Рисунок 3. Параметры ярлыка в группе безопасности Active Directory
Чтение свойств группы безопасности
Чтение данных из Active Directory осуществляется с помощью стандартной .NET FrameWork-библиотеки System.DirectoryServices, пространство имен которой необходимо импортировать в проект. Алгоритм работы этой части сайта следующий:
- определение имени текущего домена;
- поиск групп безопасности с помощью фильтра;
- чтение характеристик группы.
Определение имени домена осуществляется с помощью виртуального объекта RootDSE. Этот объект присутствует во всех доменах. Считывая значение свойства DefaultNamingContext, получают имя текущего домена (см. листинг 2).
Для поиска групп безопасности используют объект DirectoryEntry. В качестве параметров фильтра фигурирует имя группы – параметр cn (см. рис. 4) и тип объекта. Подробно фильтры описаны в статье Platform SDK: System.DirectoryServices [1].
Рисунок 4. Чтение полей группы безопасности в Active Directory
Затем осуществляется чтение значений свойств из найденных объектов.
Листинг 2. Поиск групп в Active Directory. Считывание свойств
Imports System.DirectoryServices
…
Public Domain As String = ""
…
‘ Определение имени домена с помощью виртуального объекта
‘ RootDSE
Dim obj As New DirectoryEntry("LDAP://RootDSE")
Domain = "LDAP://" + obj.Properties("DefaultNamingContext").Value
‘ Формирование поискового запроса в текущем домене
Dim obj As New DirectorySearcher()
obj.SearchRoot = New DirectoryEntry("LDAP://" + Domain)
Dim query As String = "(&(objectclass =group)(cn=" + Prefix + "*))"
obj.Filter = query
‘ Поиск
Dim bb As SearchResultCollection
bb = search.FindAll
‘ Чтение результатов поиска
For Each b As SearchResult In bb
Dim path As String = b.GetDirectoryEntry.Properties("distinguishedName").Value.ToString()
Dim read = GetObject("LDAP://" + path)
‘ чтение поля INFO
For Each t As String In read.info
Response.Write (t + "<br>")
Next
‘ чтение поля DESCRIPTION
Response.Write read.description
Next
Настройка доменных политик
Читатель наверняка уже понял, что без удаленного подключения к реестру не обойтись. Для этого необходимы административные права, которые теперь есть; имя компьютера – его легко определить с помощью инструкции Request.UserHostName. Пути в реестре, изменяемые параметры и их значения. Все необходимые условия для удаленного подключения к реестру выполнены.
Однако удаленный реестр будет недоступен, если не выполнено два дополнительных условия:
- включена служба Remote Registry (служба удаленного управления реестром);
- выключен Windows FireWall.
Оба результата можно достигнуть с помощью групповых доменных политик. По умолчанию обе политики не настроены. Для их настройки необходимо вызвать MMC-консоль. Обе политики (Remote Registry и Windows Firewall/Internet Connection Sharing) находятся в разделе «Computer Configuration» (см. рис. 5).
Рисунок 5. Настройка доменных политик
Управление реестром удаленного компьютера
Для получения доступа к реестру необходимо импортировать пространство имен Microsoft.Win32. Для удаленного управления реестром сначала получают удаленный доступ к нужным ветвям реестра, затем, используя свойство OpenSubKey, получают доступ к нужной папке указанной ветви (см. листинг 3).
Листинг 3. Удаленное подключение к реестру
Imports Microsoft.Win32.
…
Public hklm As RegistryKey
Public hccr As RegistryKey
…
hklm = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, PcName)
hccr = RegistryKey.OpenRemoteBaseKey(RegistryHive.ClassesRoot, PcName)
На следующем этапе осуществляется поиск созданных CLSID-папок сценарием. Для того чтобы они отличались от других ярлыков, необходимо внутрь CLSID добавить какой-либо флаг: параметр Flag со значением 1. Дело в том, что разные программы, такие как Nero 7, Active Sync, и другие программы для связи компьютера с сотовым телефоном, тоже создают различные объекты в папке «Мой Компьютер». Наша задача не повредить.
Целесообразно создавать флаг в CLSID, находящемся в разделе HKLMSoftwareMicrosoftCurrentVersionExplorerMyComputerNameSpace (см. листинг 4). В приведенном листинге для получения доступа к папке используется функция OpenSubKey(), аргумент которой – путь в реестре к анализируемой папке. Список подпапок получают с помощью свойства GetSubKeyNames, которое возвращает соответствующий массив данных. Для чтения параметра вызывают функцию GetValue(Flag).
Листинг 4. Определение списка значений CLSID, созданных программным способом
Public Key1 As String = "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace"
Public Key2 As String = "clsid"
…
Dim i As Integer = 0
Dim Guids As String()
Dim a As String() = hklm.OpenSubKey(Key1).GetSubKeyNames
For Each CLSID As String In a
Dim c As RegistryKey = hklm.OpenSubKey(Key1).OpenSubKey(CLSID)
Dim d As String = c.GetValue(FlagKey)
If StrComp(UCase(d), UCase(FlagValue)) = 0 Then
ReDim Preserve Guids(i)
Guids(i) = CLSID
i += 1
End If
Next
После того как список определен, целесообразно удалить все определенные процедурой подпапки и создать новые. Это связано с тем, что пути могут измениться, для того чтобы упростить листинг, рекомендуется это сделать.
Осталось рассмотреть две процедуры – удаление ветви реестра и запись параметров. Удаление параметров происходит в цикле (см. листинг 5). Будьте внимательны и удаляйте обе ветви реестра, которые создает сценарий. Не создавайте из реестра помойку – в конечном итоге это пагубно скажется на работоспособности рабочей станции.
Листинг 5. Удаление ветви реестра
For Each GUID As String In DetectGUID()
hklm.OpenSubKey(Key1, True).DeleteSubKeyTree(GUID)
hccr.OpenSubKey(Key2, True).DeleteSubKeyTree(GUID)
Next
Для записи значений в реестр используется функция SetValue. При записи данных есть одна тонкость. Все значения имеют тип данных REG_SZ, и только один – REG_BINARY. Запись бинарных данных осуществляется из массива, элементы которого – бинарные числа (см. листинг 6).
Листинг 6. Запись данных в реестр
hklm.OpenSubKey(Key1, True).CreateSubKey(RegistryPath).SetValue(FlagKey, FlagValue, RegistryValueKind.String)
hccr.OpenSubKey(Key2, True).CreateSubKey(RegistryPath).SetValue("", GroupValues(0))
…
Dim temp_array As Byte() = {0, 1, 0, 160}
hccr.OpenSubKey(Key2, True).OpenSubKey(RegistryPath, True).CreateSubKey("shellFolder").SetValue("attributes", temp_array, RegistryValueKind.Binary)
Запуск веб-сайта из сценария в фоновом режиме
В завершение статьи осталось рассказать о фоновом запуске веб-сайта из сценария. Для создания экземпляра Internet Explorer используется метод CreateObject(). После вызова объекта InternetExplorer.Application обязательно необходимо дождаться, пока он запустится (см. листинг 6), и только после этого запускать страницу. Для обеспечения запуска приложения в фоновом режиме присвойте свойства visible значение 0 или false.
Листинг 7. Запись данных в реестр
set oIE=CreateObject("InternetExplorer.Application")
do while (oie.busy)
loop
oIE.navigate "http://mycomputer"
oIE.visible = 0
oIE.Quit
set oIE=Nothing
Заключение
Я надеюсь, что статья будет вам полезной и вы сможете развить предложенную тему, увеличив безопасность своей сети и сделав работу сотрудников еще комфортнее.
Приложение
CLSID – уникальный 32-байтный (128-битный) номер, состоящий из шестнадцатеричных чисел. Первые 8 байт генерируются случайным образом, следующие четыре используются для создания текущего значения даты и времени, остальные генерируются на основе данных о конфигурации компьютера. Как правило, CLSID-номер заключается в фигурные скобки и имеет следующий формат записи: {xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx}. Стандартные объекты Windows, такие как «Панель Управления», «Корзина» во всех ОС имеют фиксированный CLSID.
- System.DirectoryServices – http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sds/sds/directoryservices_directorysearcher_filter.asp.