FAR и сетевые диски. Доступ к сетевым дискам из программ, запущенных с повышенными привилегиями

Одним из существенных улучшений системы безопасности ОС семейства Windows (начиная с Vista) являлось внедрение функционала User Account Control (UAC). Контроль учетных записей запрашивает подтверждение пользователя каждый раз, когда запускаемая программа пытается внести изменения в параметры системы. Одним из побочных эффектов работы UAC является невозможность доступа к подключенным (через net use) сетевым дискам из приложений, запущенных в привилегированном режиме (Run As Administrator). Это означает, что при запуске командной строки или файлового менеджера (того же, Total Commander) с повышенными правами, в них будут отсутствовать (не доступны) буквы дисков смонтированных сетевых папок.

В этой заметке мы покажем, как в Windows 10, Windows 8.1 и Windows 7 предоставить доступ к сетевым дискам из приложений, работающих в привилегированном режиме (запущенных от имени администратора). Проблема проявляется как для сетевых папок, подключенных через групповые политики, так и для папок подключенных пользователей самостоятельно.

Важно. Настоятельно не рекомендуется совсем отключать UAC, даже для одного конкретного приложения.

Действительно, при включенном UAC из «привилегированного» приложения в Windows нельзя получить доступ к подключенному в обычном режиме сетевому диску. Продемонстрируем, как выглядит проблема. Например, убедимся, что в командной строке, запущенной с правами обычного пользователя системы, имеется доступ к содержимому подключенного сетевого диска Z:\.
Если в контексте этого же пользователя открыть окно командной строки с правами администратора, то при попытке получить доступ к этому же диску, появится сообщение, что указанный путь не найден:
The system cannot find the path specified.
Системе не удается найти указанный путь.

Такое поведение системы может вызывать ряд неудобств при частом запуске приложений в привилегированном режиме. Можно запускать приложения без прав администартора, но это не всегда применимо.
Почему это происходит? Данная особенность связана с механизмом работы UAC для пользователя с правами локального администратора. Дело в том, что при входе такого пользователя в систему создаются два маркера доступа: один маркер доступа с отключенными правами администратора (маркер фильтрованного доступа – из-под которого запускаются большинство программ) и маркер полноценного администратора, обладающего полными правами в системе (в этом контексте выполняются все программы, получившие подтверждение на повышение прав в UAC).
Если с помощью команды whoami /all сравнить текущие привилегии одного и того же пользователя в двух сессиях cmd.exe (обычной и привилегированной), можно увидеть, что они сильно отличаются. В следующей таблице перечислены отличия в группах и текущих полномочиях в каждой сессии.

Обычная сесия пользователя Привелигированная сесиия пользователя
Группа доступа Обязательная метка\Средний обязательный уровень (Medium Mandatory Level) Метка S-1-16-8192 Обязательная метка\Высокий обязательный уровень (High Mandatory Level) Метка S-1-16-12288
Привелегии SeLockMemoryPrivilege

SeMachineAccountPrivilege
SeShutdownPrivilege
SeChangeNotifyPrivilege
SeUndockPrivilege
SeIncreaseWorkingSetPrivilege
SeTimeZonePrivilege SeLockMemoryPrivilege

SeIncreaseQuotaPrivilege
SeMachineAccountPrivilege
SeSecurityPrivilege
SeTakeOwnershipPrivilege
SeLoadDriverPrivilege
SeSystemProfilePrivilege
SeSystemtimePrivilege
SeProfileSingleProcessPrivilege
SeIncreaseBasePriorityPrivilege
SeCreatePagefilePrivilege
SeBackupPrivilege
SeRestorePrivilege
SeShutdownPrivilege
SeSystemEnvironmentPrivilege
SeChangeNotifyPrivilege
SeRemoteShutdownPrivilege
SeUndockPrivilege
SeManageVolumePrivilege
SeImpersonatePrivilege
SeCreateGlobalPrivilege
SeIncreaseWorkingSetPrivilege
SeTimeZonePrivilege
SeCreateSymbolicLinkPrivilege
SeDelegateSessionUserImpersonatePrivilege


При включенном UAC приложения под одним и тем же пользователем могут запускаться в двух контекстах (привилегированном и непривилегированном). При подключении общих сетевых папок, система создает символические ссылки (DosDevices), в которые хранится сопоставление буквы диска и UNC пути. Эти ссылки ассоциируются с текущим сеансом для текущего маркера доступа процесса и из-под другого маркера недоступны.
Соответственно, может иметь место и обратная проблема: если пользователь обладает правами администратора на своем компьютере, то при подключении сетевых дисков через логон-скрипты групповых политик, задания планировщика или SCCM (которые запускаются с повышенными привилегиями), эти диски не видны пользователю в проводнике Windows (непривилегированный процесс).
Примечание. В Windows Server можно запустить Проводник Windows с повышенными привилегиями.
В качестве обходного решения можно порекомендовать подключать (через net use или rundll32 SHELL32.dll,SHHelpShortcuts_RunDLL Connect) сетевые диски в контексте командной строке, запущенной с правами администратора. Но это решение не всегда применимо, и не очень удобно.
Есть более простое решение, для его реализации нужно внести следующие изменения в реестр:
Откройте редактор реестра (regedit.exe).
Перейдите в раздел реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System .
Создайте новый параметр (типа DWORD) с именем EnableLinkedConnections и значением 1 .

Совет. То же самое можно сделать одной командой:
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System" /v "EnableLinkedConnections" /t REG_DWORD /d 0x00000001 /f
Перезагрузите компьютер (или перезапустите службу LanmanWorkstation).
После перезагрузки убедитесь, что пользователь видит сетевые дискам из программ, запущенных с правами администратора. Верно и обратное утверждение, все сетевые диски, подключенные в контексте привилегированной сессии, будут доступны и в обычной сессии.

Совет. К сожалению, в групповых политиках отсутствует возможность включения параметра EnableLinkedConnections, поэтому для распространения этих настроек на компьютеры домена придется распространить данный параметр реестра на компьютеры с помощью GPP.
Как это работает. После включения параметра реестра EnableLinkedConnections, служба LanmanWorkstation и LSA будут проверять наличие второго маркера доступа, связанного с сессией текущего пользователя. Если такой маркер доступа будет обнаружен, список подключенных сетевых дисков будет скопирован из одного маркера в другой. Таким образом сетевые диски, подключенные в привилегированном режиме, будут видны в обычном и наоборот.
Совет. В качестве альтернативного решения можно предложить создать символическую ссылку на целевой сетевой каталог. Например, так
mklink /D c:\docs \\msk-fs1\docs
Доступ к данному каталогу будет возможен и в обычном и в привилегированном режиме. Из недостатков метода, отметим, что доступ на общую папку выполняется с полномочиями текущего пользователя. Нельзя, как в случае с net use, использовать учетную запись другого пользователя.

Комментарии

Популярные сообщения из этого блога

Права на папки и файлы (unix/chmod)

Автоматическое монтирование дисков и разделов в Linux или что такое fstab? Проблема Debian

Как подключить сетевой диск Windows в Linux