DriveInfo.GetDrives() не возвращает подключенные диски при запуске от имени администратора
Я создаю приложение WPF, которое, помимо прочего, должно проверять наличие нескольких подключенных дисков. Код прост:
DriveInfo[] systemDrives = DriveInfo.GetDrives();
foreach (DriveInfo i in systemDrives)
{
if ((i.Name.Contains("V")) && (i.IsReady))
{
result = true;
break;
}
}
Сопоставленные диски отображаются для всех пользователей. Приведенный выше код отлично работает при запуске от имени обычного пользователя, однако, если Visual Studio 2010 запускается от имени администратора, метод GetDrives возвращает только фиксированные диски и дисковод DVD, но не подключенные диски. То же самое происходит, если исполняемый файл запускается от имени администратора. Есть идеи, почему это может происходить?
1 ответ
Это на самом деле нормальное поведение. Как вы видели в XP, сопоставления дисков зависят от контекста пользователя. Таким образом, если у User1 есть диск H: сопоставленный с \server\share1, User2 автоматически не получает никакого доступа к этому сопоставлению диска H:; он существует только в сеансе пользователя User1. Если пользователь 2 хочет получить доступ к \ server \ share1, ему нужно создать свое собственное сопоставление: диск H: или любой другой подходящий диск.
Ну, это то же самое в Vista .... только более того.
В отличие от предыдущих версий Windows, когда администратор входит в систему на компьютере под управлением Windows Vista, токен полного доступа администратора пользователя разделяется на два токена доступа: токен полного доступа администратора и токен стандартного доступа пользователя. Во время входа в систему компоненты авторизации и контроля доступа, идентифицирующие администратора, удаляются, в результате чего получается стандартный токен доступа пользователя. Стандартный маркер доступа пользователя затем используется для запуска рабочего стола, процесса Explorer.exe. Поскольку все приложения наследуют свои данные контроля доступа с момента первого запуска рабочего стола, они также работают как обычный пользователь. После входа администратора токен полного доступа администратора не вызывается, пока пользователь не попытается выполнить административную задачу.
Таким образом, когда администратор "повышает уровень" для выполнения какого-либо действия, требующего административного доступа, его "разделенный токен" временно заменяется полным административным токеном. По сути, это означает, что у них теперь другой пользовательский контекст. Таким образом, сопоставления дисков также изменены. Таким образом, диск H: больше не имеет действительного сопоставления в текущем контексте.
Обходной путь, который я использовал, - это открыть административную командную строку - где у вас постоянно есть маркер с повышенными правами - и создать оттуда соответствующее сопоставление дисков (net use h: \server\share1). Поскольку обычный пользователь и администратор с повышенными правами имеют общее представление о том, что означает диск "H:", все работает нормально.
Я понимаю (ну, вроде как!), Почему этот дизайн на месте. Я не буду пытаться критиковать или защищать это. Но у вас есть это.
В идеальном мире администраторы могли бы настраивать "глобальные" сопоставления, которые автоматически применяются к каждому пользовательскому контексту на машине (почти как на реальных устройствах). Но этого не произошло. Большинство операционных систем в той или иной степени смешаны с неопрятными компромиссами.
Вы можете включить отображение подключенных дисков для администратора с помощью записи реестра:
HKEY_LOCAL_MACHINE / ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ /Microsoft/Windows/CurrentVersion/Policies/System
создать DWORD EnableLinkedConnections со значением 1
как описано здесь:http://www.winability.com/how-to-make-elevated-programs-recognize-network-drives/
Это сработало для меня на Win 10.