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

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

Проблема наблюдается, если выполняются следующие условия

  • В сессию пользователя подключены сетевые диски (через GPO или вручную через net use);
  • На компьютере включен UAC (параметр GPO User Account Control: Behavior of the elevation prompt for administrators in Admin Approval Mode имеет значение по-умолчанию “Prompt for credentials”);политика UAC Behavior elevation prompt
  • У текущего пользователя есть права локального администраора на компьютере и он запускает приложение в режиме Run as administrator.

В этом случае сетевые диски отображаются в проводнике Windows и в программах, но недоступны в любых приложениях, запуженные в привелигированном режиме.

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

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

Подключенные сетевые диски не отображаются в приложении

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

Например, откроем командную строку с правами пользователя и проверим что мы можем получить доступ к содержимому подключенного сетевого диска Z:\.

Net use
Dir 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). Но это решение не всегда применимо, и не очень удобно.

Enablelinkedconnections: разрешить доступ к сетевым дискам из программ, запущенных с правами администратора

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

  1. Откройте редактор реестра (regedit.exe);
  2. Перейдите в раздел реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System ;
  3. Создайте новый параметр (типа DWORD) с именем EnableLinkedConnections и значением 1 ;Параметр реестра EnableLinkedConnections
    Совет. То же самое можно сделать одной командой:
    New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System' -Name EnableLinkedConnections -Value 1 -PropertyType 'DWord'
  4. Перезагрузите компьютер (или перезапустите службу LanmanWorkstation командой PowerShell: get-service LanmanWorkstation |Restart-Service –Force, и перезайдите в систему).
Это работает во всех версиях Windows, начиная с Vista и заканчивая Windows 10 / Windows Server 2016.

В обратную сторону это тоже работает: все сетевые диски, подключенные в контексте привилегированной сессии, будут доступны и в обычной сессии.

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

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

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

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

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


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


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

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

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

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