.NET Directory.Exists отрича съществуването на картографирано мрежово устройство, когато се изпълнява като администратор

Пиша малка .NET програма на Windows 7. Едно нещо, което трябва да направи, е да създаде символни връзки, което изглежда изисква от мен да имам администраторски права. Също така трябва да може да работи с картографирани мрежови устройства (например R:\, което в моята система картографира към \\titanium\Private\).

Използвам Directory.Exists(path), за да проверя дали съществува път.

Когато стартирате програмата като обикновен потребител (администраторски акаунт, но не "като администратор"), това работи добре на картографираното мрежово устройство.

Когато стартирате програмата като администратор (с UAC), тя не успява да намери съществуващи директории. В резултат на това програмата отказва да признае, че R:\Steam Games\ е директория, която действително съществува.

Малко съм объркан защо се случва това. Използването на пълния UNC път (\\titanium\Private\Steam Games\) също не работи.

Някой сблъсквал ли се е с това преди? Има ли добро решение? Трябва ли да форматирам пътищата по различен начин (забележка: повечето от тях в момента са форматирани с Path.Combine, така че трябва да са правилни).

Благодаря за вашата помощ.

(Като пример, Directory.Exists(@"R:\Steam Games\") връща false, когато се изпълнява като администратор, но тази папка съществува. Извикването на функцията правилно връща true, когато се изпълнява редовно).

Редактиране: Проблемът наистина изглежда е, че технически администраторът е различен потребителски акаунт. Дори не можех да използвам UNC пътеки, защото бях влязъл в моя файлов сървър само под моя обикновен потребител, а не под „Администратор“. Като (сравнително хакерско) заобиколно решение, аз просто стартирам програмата си с обикновени привилегии и след това използвам Process.Start, за да извикам екземпляр на cmd.exe с аргументите за създаване на символна връзка (и глагол "runas", за да получа UAC подканата).


person Ethan    schedule 23.07.2011    source източник
comment
Гласува се за затваряне като извън темата. Проблемът тук е UAC (и че UAC потребителят не е в същата сесия като не-UAC потребителя) и няма нищо общо с програмирането.   -  person Lucero    schedule 24.07.2011
comment
Мисля, че това е много по темата, като програмист трябва да сте далеч от проблеми, които се случват, ако краен потребител реши да повиши вашата програма.   -  person Scott Chamberlain    schedule 24.07.2011
comment
Съгласен съм със Скот. Това е често срещан програмен проблем и според мен това е страхотен сайт за него.   -  person Charlie Flowers    schedule 24.07.2011


Отговори (3)


Картографираните устройства в Windows са свързани с потребителски контекст. Устройство, свързано с акаунт: UserA, няма да бъде достъпно за UserB. Въпреки това можете да създадете същия unc път, съпоставен с една и съща буква на устройство под различни потребители.

Използването на пълния unc път обаче трябва да работи.

Повече информация на support.microsoft.com: 1, 2.

person mservidio    schedule 23.07.2011
comment
Пълните UNC пътеки изглежда също не работят. Подозирам, че по някакъв начин моето влизане в мрежовия дял е свързано само с моя потребител, така че ако се опитам да осъществя достъп до същия дял като, да речем, администратор, ще се очаква да се авторизирам повторно. Има ли начин да се заобиколи това? - person Ethan; 24.07.2011
comment
Какъвто и потребител да изпълнява приложението, се нуждае от разрешение за unc пътя. Ако можете да получите достъп до пътя, когато сте влезли като този потребител, тогава приложението трябва да има достъп до същия път програмно чрез Directory.Exists... - person mservidio; 24.07.2011
comment
Използвате администраторски акаунт, но това локален администраторски акаунт ли е? Този администраторски акаунт има ли достъп до отдалечения път? Можете ли да потвърдите това? - person mservidio; 24.07.2011
comment
Току-що опитах това в PowerShell, стартиран като администратор: `cd \\titanium\Private`, но не работи (не съществува). Защо би било това? Как мога да го заобиколя? Предполагам, че мога да напиша отделна програма, която прави символните връзки и моята програма просто да я изпълнява като администратор при поискване, но изглежда като ужасно много работа за такава проста задача. - person Ethan; 24.07.2011
comment
Вярвам, че в прозорците на командния ред (и bat/cmd скриптове) не можете директно да препращате към unc пътища. Трябва да използвате картографирани устройства. Ще се свържа с вас след няколко минути. Ще стартирам Windows машината си и ще проверя. - person mservidio; 24.07.2011
comment
Ето защо използвах PowerShell - PowerShell поддържа UNC пътеки (използвал съм ги и преди, само не като администратор). - person Ethan; 24.07.2011
comment
Определено не можете да използвате UNC път в командния ред. Няма причина Directory.Exists да не работи за вас, освен че е проблем с разрешение. Трябва да се уверите, че потребителят, под който изпълнявате приложението, има достъп до директорията, до която се опитвате да получите достъп. Това или трябва да се представите за потребител, който има достъп до директорията. - person mservidio; 24.07.2011
comment
Командният ред (cmd.exe) поддържа UNC път, но с ограничения. Не можете да имате UNC път като текуща директория, но можете да копирате файл от UNC път на локално устройство. - person Alexey Ivanov; 24.07.2011
comment
Това изглежда като проблем с разрешението. Потребителят без повишени права има достъп до мрежовото устройство. Същият потребител с активиран администраторски токен също трябва да има достъп до мрежовото устройство и картографираните устройства също трябва да са видими. Но ако въведете друго потребителско име/парола при повдигане, тогава точките по-горе са неверни: друг потребител има други разрешения и може да му бъде отказан достъп до мрежовия път и няма картографирано устройство R: или то може да бъде свързано с друг мрежов път. - person Alexey Ivanov; 24.07.2011

Основната причина, поради която не работи, е, че потребителят на IIS няма разрешение за достъп до пътя. Когато работите като обикновен потребител, достъпът се дава на потребителя, т.е. за да работи, трябва да дадете разрешение на папката за IIS Следвайте както по-долу за UNC пътя, за да работите в услуги, управлявани от iis:

Свойства --> Сигурност --> Редактиране--> Добавяне --> IIS_WPG

person moses mathew    schedule 23.06.2014

Това беше обсъдено тук. Очевидно в по-ранните версии на .Net Framework в документацията изрично се споменава, че това не е възможно („Методът Exists не извършва мрежово удостоверяване. Ако направите заявка към съществуващ мрежов дял, без да сте предварително удостоверени, методът Exists ще върне false.“ ). Документацията 4.0 вече не съдържа това изречение, но поведението не се е променило.

Намерих заобиколно решение тук (но реши да не го използва).

person cdonner    schedule 16.08.2011