Доступ к сетевым дискам из программ, запущенных с правами администратора
Если вы используете подключенные сетевые диски на рабочих станциях, вероятно вы заметили, что они не доступны в программах, запущенных с правами администратора (в том числе в 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”);
- У текущего пользователя есть права локального администраора на компьютере и он запускает приложение в режиме Run as administrator.
В этом случае сетевые диски отображаются в проводнике Windows и в программах, но недоступны в любых приложениях, запуженные в привелигированном режиме.
В этой заметке мы покажем, как в Windows 10 разрешить доступ к сетевым дискам из приложений, работающих в привилегированном режиме (запущенных от имени администратора). Проблема проявляется как для сетевых дисков, подключенных через групповые политики, так и для папок подключенных пользователей самостоятельно.
Подключенные сетевые диски не отображаются в приложении
Проверим, что при включенном 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 |
При включенном UAC приложения под одним и тем же пользователем могут запускаться в двух контекстах (привилегированном и непривилегированном). При подключении общих сетевых папок, система создает символические ссылки (DosDevices), в которых хранится сопоставление буквы диска и UNC пути. Эти ссылки ассоциируются с текущим сеансом для текущего маркера доступа процесса и недоступны из-под другого маркера.
Соответственно, может иметь место и обратная проблема: если пользователь обладает правами администратора на своем компьютере, то при подключении сетевых дисков через логон-скрипты групповых политик, задания планировщика или SCCM (которые запускаются с повышенными привилегиями), эти диски не видны пользователю в проводнике Windows (непривилегированный процесс).
В качестве обходного решения можно порекомендовать подключать сетевые диски из командой строки, запущенной с правами администратора (через
net use
или
rundll32 SHELL32.dll,SHHelpShortcuts_RunDLL Connect
). Но это решение не всегда применимо, и не очень удобно.
Enablelinkedconnections: разрешить доступ к сетевым дискам из программ, запущенных с правами администратора
Есть более простое решение. Для его реализации нужно внести следующие изменения в реестр:
- Откройте редактор реестра (regedit.exe);
- Перейдите в раздел реестра HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem ;
- Создайте новый параметр (типа DWORD) с именем EnableLinkedConnections и значением 1 ;
Совет. То же самое можно сделать одной командой:
New-ItemProperty -Path 'HKLM:SOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem' -Name EnableLinkedConnections -Value 1 -PropertyType 'DWord'
- Перезагрузите компьютер (или перезапустите службу LanmanWorkstation командой PowerShell:
get-service LanmanWorkstation |Restart-Service –Force
, и перезайдите в систему).
Это работает во всех версиях Windows, начиная с Vista и заканчивая Windows 10 / Windows Server 2016.
В обратную сторону это тоже работает: все сетевые диски, подключенные в контексте привилегированной сессии, будут доступны и в обычной сессии.
Как это работает. После включения параметра реестра EnableLinkedConnections, служба LanmanWorkstation и LSA будут проверять наличие второго маркера доступа, связанного с сессией текущего пользователя. Если такой маркер доступа обнаружен, список подключенных сетевых дисков копируется из одного маркера в другой. Таким образом сетевые диски, подключенные в привилегированном режиме, будут видны в обычном и наоборот.
mklink /D c:docs msk-fs1docs
Доступ к данному каталогу будет возможен и в обычном и в привилегированном режиме. Из недостатков метода, отметим, что доступ на общую папку выполняется с полномочиями текущего пользователя. Нельзя, как в случае с net use, использовать учетную запись другого пользователя.
После включения параметра EnableLinkedConnections сетевые диски также станут доступны из заданий планировщика, запущенных из-под текущего пользователя. Если задание запускается от имени LocalSystem или другого пользователя, сетевые диски текущего пользователя, естественно, будут недоступны.
Windows Server 2016
Доступ к сетевым дискам из программ, запущенных с правами администратора