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

Одним из существенных улучшений системы безопасности ОС семейства 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

whoami all

При включенном UAC приложения под одним и тем же пользователем могут запускаться в двух контекстах (привилегированном и непривилегированном). При подключении общих сетевых папок, система создает символические ссылки (DosDevices), в которые хранится сопоставление буквы диска и UNC пути. Эти ссылки ассоциируются с текущим сеансом для текущего маркера доступа процесса и из-под другого маркера недоступны.

Соответственно, может иметь место и обратная проблема: если пользователь обладает правами администратора на своем компьютере, то при подключении сетевых дисков через логон-скрипты групповых политик, задания планировщика или SCCM (которые запускаются с повышенными привилегиями), эти диски не видны пользователю в проводнике Windows (непривилегированный процесс).

В качестве обходного решения можно порекомендовать подключать (через net use или rundll32 SHELL32.dll,SHHelpShortcuts_RunDLL Connect) сетевые диски в контексте командной строке, запущенной с правами администратора. Но это решение не всегда применимо, и не очень удобно.

Есть более простое решение, для его реализации нужно внести следующие изменения в реестр:

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

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

Доступ к сетевым дискам (net use) из прилжения, запущенного с повышенными правами

Совет. К сожалению, в групповых политиках отсутствует возможность включения параметра EnableLinkedConnections, поэтому для распространения этих настроек на компьютеры домена придется распространить данный параметр реестра на компьютеры с помощью GPP.

Как это работает. После включения параметра реестра EnableLinkedConnections, служба LanmanWorkstation и LSA будут проверять наличие второго маркера доступа, связанного с сессией текущего пользователя. Если такой маркер доступа будет обнаружен, список подключенных сетевых дисков будет скопирован из одного маркера в другой. Таким образом сетевые диски, подключенные в привилегированном режиме, будут видны в обычном и наоборот.

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


Предыдущая статья Следующая статья


Комментариев: 8 Оставить комментарий

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)