Почему моя программа не распознает сопоставленные пути UNC? - PullRequest
5 голосов
/ 06 октября 2011

У меня проблемы с записью на подключенный сетевой диск (P :) в Windows 7 из моей программы Delphi. Когда я пытаюсь, например, ForceDirectories('P:\test\folder'), я получаю сообщение об ошибке (путь не найден).

Я попытался ввести путь UNC в коде (ForceDirectories('\\computername\share\test\folder')), и это работает. Однако ExpandUNCFileName('P:\'), похоже, не работает; возвращает «P: \». В Windows XP ExpandUNCFileName('P:\') возвращает UNC-путь.

Как получить UNC-путь в Delphi в Windows 7 или записать иным образом на подключенный сетевой диск?

После дальнейшего изучения у меня как будто отсутствует какая-то инициализация в Windows. У меня есть другое приложение (app2), которое использует TcxShellComboBox (компонент DevExpress). После перехода к P: в этом поле со списком в app2 вызовы ExpandUNCFileName работают правильно в первом приложении. То же самое с FileExists для файлов под P :, возвращает False до перехода к P: в app2, возвращает true после и до перезагрузки компьютера.

1 Ответ

10 голосов
/ 06 октября 2011

Согласно статье Microsoft KB , если включен контроль учетных записей и если вы подключили сетевой диск из проводника Windows (без повышенных прав), программы с повышенными правами доступа не будут иметь доступа к этому диску. Цитата:

Если пользователь вошел в Windows Vista или Windows 7, и если контроль учетных записей пользователей включен, программа, использующая маркер фильтрованного доступа пользователя и программа, использующая маркер полного доступа администратора, может работать одновременно время. Поскольку LSA создал токены доступа во время двух отдельных сеансов входа, токены доступа содержат отдельные идентификаторы входа.

Когда сетевые общие ресурсы сопоставлены, они связаны с текущим сеансом входа в систему для текущего маркера доступа к процессу. Это означает, что если пользователь использует командную строку (Cmd.exe) вместе с отфильтрованным токеном доступа для сопоставления общего сетевого ресурса, сетевой ресурс не сопоставляется для процессов, выполняющихся с маркером полного доступа администратора.

Так как вы упомянули в комментариях, что запускаете Delphi "Как администратор" (повышено), это ваша проблема.

Решения:

  1. Не запускайте Delphi с повышенными правами, если вам это не нужно. Если вам требуется повышение прав в программном обеспечении, разделите его на две части (повышенные и не повышенные) и получите доступ к подключенному сетевому диску из первой части. Затем получите доступ к другой части, используя COM-объект с повышенными правами или просто запустив отдельный исполняемый файл.

  2. Отобразите сетевой диск из сетевого запроса с повышенными правами, чтобы сопоставленный сетевой диск был доступен для повышенного пользователя:

    а. Откройте командную строку с повышенными правами (запустите «cmd.exe» от имени администратора)

    б. Тип net use p: \\computername\share\test\folder

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