Конференция "WinAPI" » Как получить унифицированное имя файла?
 
  • тимохов (14.04.08 19:02) [0]
    Здравствуйте.

    СИТУАЦИЯ
    Допустим, есть 2 полных пути к файлам "E:\abc.pas" и "\\mainserver\dev\abc.pas", которые указывают на один и тот же файл (здесь диск E: подключен к ресурсу "\\mainserver\dev").

    ЗАДАЧА
    Я хочу, имея 2 строки, которые представляют полные имена файлов, иметь возможность определить, указывают ли они на один и тот же файл или нет, вне зависимости от того, какой формат представления имени файла используется - UNC или с буквой диска.

    ВОПРОС
    Можно ли как-то выполнить мою задачу легко и красиво?

    Заранее спасибо.

    ЗЫ. В принципе я умею с помощью WNetOpenEnum получать ассоциативный массив: <имя диска> - <удаленный путь>. Потом по идее могу попытаться преобразовать полные имена файлов к единому формату. Вопрос в том, если ли что-то готовое в WinAPI на этот счет?
  • Leonid Troyanovsky © (14.04.08 19:23) [1]

    > тимохов   (14.04.08 19:02)  

    >  Вопрос в том, если ли что-то готовое в WinAPI на этот счет?

    WNetGetUniversalName ?

    --
    Regards, LVT.
  • тимохов (14.04.08 19:55) [2]

    > Leonid Troyanovsky ©   (14.04.08 19:23) [1]

    да, видимо, это оно.
    спасибо.
  • тимохов (14.04.08 20:03) [3]
    Вот еще какая функция есть в sysutils ExpandUNCFileName.
    Она, собсно, и использует указанную фуницию WNetGetUniversalName в конечном итоге.
  • тимохов (15.04.08 15:16) [4]
    Вопрос возник.

    СИТУАЦИЯ
    Когда я выполняю функцию ExpandUNCFileName из обычного приложения, то все работает - drive-based имя переводится в формат UNC.
    Если же запускаю из под сервиса, то как было drive-based имя, так оно и осталось.

    ВОПРОС
    В чем может быть причина?

    ТТХ
    1. Win2000.
    2. Сервис писан на основе дельфового TService.
    3. Сервис запускается из под LocalSystem.
  • Leonid Troyanovsky © (15.04.08 15:56) [5]

    > тимохов   (15.04.08 15:16) [4]

    > ВОПРОС
    > В чем может быть причина?

    GetLastError, WNetGetLastError

    > 3. Сервис запускается из под LocalSystem.

    Local System не расчитан на работу с сетью, см. Network Service

    --
    Regards, LVT.
  • тимохов (15.04.08 16:16) [6]

    > Leonid Troyanovsky ©   (15.04.08 15:56) [5]
    > GetLastError, WNetGetLastError


    Функция GetLastError говорит ERROR_NOT_CONNECTED


    > Local System не расчитан на работу с сетью, см. Network
    > Service

    Эээ, это как?
    А как же все серверные приложения? Например, MSSQL - они же из под LocalSystem работают и по сети работают?
    Или я что-то не так понимаю?
  • тимохов (15.04.08 16:18) [7]
    Ну вообще понятно почему не работает. Никто же под localsystem не делал

    net use r: \\server\resource



    потому к r: ничего и не подмепино.
  • Anatoly Podgoretsky © (15.04.08 16:30) [8]
    > тимохов  (15.04.2008 16:16:06)  [6]

    MSSQL не работает по сети, по сети работают клиенты/агенты.
    Кроме того есть имперсонация.

    Local System
  • Anatoly Podgoretsky © (15.04.08 16:32) [9]
    > тимохов  (15.04.2008 16:16:06)  [6]

    Кроме того нет такой учетной записи, есть System, Local Servce, Network Service
    У меня из под учетной записи System
  • тимохов (15.04.08 16:34) [10]

    > Anatoly Podgoretsky ©   (15.04.08 16:30) [8]

    Где вообще написано, что LocalSystem не может работать по сети?

    Почему все же нет LocalSystem?

    Вот выдержка из MSDN
    LocalSystem Account
    The LocalSystem account is a predefined local account used by the service control manager...
  • тимохов (15.04.08 16:40) [11]
    Вообще как такое может быть, что мой сервис-таки видит подмапиный диск и может на него писать?

    Т.е. R: соответствует \\soft2k\exchange. Сервис пишет на R: и все работает?
    Откуда в LocalSystem берется информация о \\soft2k\exchange?

    Я так понял, что сервис обращается к HKEY_USERS, где в HKEY_USERS\S-1-5-21-2052111302-1060284298-1417001333-1113\Network

    Так что-ли?
  • Anatoly Podgoretsky © (15.04.08 16:41) [12]
    > тимохов  (15.04.2008 16:34:10)  [10]

    Думаю в справке рядовая опечатка.
  • Anatoly Podgoretsky © (15.04.08 16:42) [13]

    > 3. Сервис запускается из под LocalSystem.

    Запусти диспетчер задач.
  • тимохов (15.04.08 16:43) [14]

    > Anatoly Podgoretsky ©   (15.04.08 16:41) [12]
    > > тимохов  (15.04.2008 16:34:10)  [10]
    >
    > Думаю в справке рядовая опечатка.

    Вы не издеваетесь, случаем, Анатолий?

    http://msdn2.microsoft.com/en-us/library/ms684188(VS.85).aspx
  • тимохов (15.04.08 16:49) [15]

    > Anatoly Podgoretsky ©   (15.04.08 16:42) [13]
    > > 3. Сервис запускается из под LocalSystem.
    > Запусти диспетчер задач.


    Что ты этим хочешь сказать? Ну что как клещами нужно вытягивать. Я должен о чем-то догадаться? :) Ну да по SYSTEM он работает, т.к. LocalSystem это специальный "predefined local account used by the service control manager..."

    Вопрос все же интересный - как сервис "видит" буквы дисков на сетевые ресурсы?
  • Anatoly Podgoretsky © (15.04.08 16:57) [16]
    > тимохов  (15.04.2008 16:49:15)  [15]

    Так ты запустил диспетчер или нет, если запустил то сообщи оттуда информацию.
  • тимохов (15.04.08 17:19) [17]

    > Anatoly Podgoretsky ©   (15.04.08 16:57) [16]
    > > тимохов  (15.04.2008 16:49:15)  [15]
    >
    > Так ты запустил диспетчер или нет, если запустил то сообщи
    > оттуда информацию.

    Я не очень понимаю как поможет дисп. задач - он у меня не показывает эккаунт, под которым запущено. Поэтому я посмотрел в ProcessExplorer. Он показывает, что user: NT AUTHORITY\SYSTEM.

    Вообще не могу ничего понять :)
    Какие-то МОИ сетевые диски сервис видит, какие-то - не видит.
    Какая причинно следственная связь, понять не могу.

    Поговорив с нашим админом я выяснил, что сервис видит те диски, которые автоматически прописываются всем в login-скрипте. Тогда я понять не могу - разве LocalSystem заходит в сеть? Разве для него выполняется login-скрипт?

    Путаница какая-то...
  • Игорь Шевченко © (15.04.08 17:39) [18]

    > NT AUTHORITY\SYSTEM


    system же, а не LocalSystem
  • тимохов (15.04.08 17:42) [19]

    > Игорь Шевченко ©   (15.04.08 17:39) [18]
    > > NT AUTHORITY\SYSTEM
    > system же, а не LocalSystem


    Ну и что? У меня все сервисы так запущены. LocalSystem нет такого эккаунта. Он только в SCM есть.

    Вывод то какой? :)
  • Игорь Шевченко © (15.04.08 17:45) [20]

    > Он только в SCM есть.


    его и там нету :)
    NT AUTHORITY\SYSTEM - он так называется. LocalSystem - это алиас.

    > Какие-то МОИ сетевые диски сервис видит, какие-то - не видит.
    >  
    > Какая причинно следственная связь, понять не могу.


    а ты посмотри, что написано в реестре на предмет HKEY_USERS\.DEFAULT - System оттуда берет информацию
  • тимохов (15.04.08 17:49) [21]

    > а ты посмотри, что написано в реестре на предмет HKEY_USERS\.
    > DEFAULT - System оттуда берет информацию

    Я понял, что здесь как-то замешан HKEY_USERS.
    Но:
    1. Это не HKEY_USERS\.DEFAULT, а HKEY_USERS\S-1-5-21-2052111302-1060284298-1417001333-1113\Network
    2. В списке есть диски: R, N, M, но вот сервис работает только с R, т.к. именно он прописан в login-скрипте.

    ---------
    В общем - пусть сами админы разбираются :) Я в EventLog кидаю все сообщения об ошибках. Небось разберется что к чему :)
  • Игорь Шевченко © (15.04.08 22:39) [22]

    > 1. Это не HKEY_USERS\.DEFAULT, а HKEY_USERS\S-1-5-21-2052111302-
    > 1060284298-1417001333-1113\Network


    А это чей SID ?
  • Тимохов (17.04.08 02:47) [23]
    чей SID не знаю, ибо не знаю как это проверять.

    вообще тема осталась для меня не до конца понятной.
    переложу аднака это на плечи админа, настраивающего продукт: а нечего сетевые диски использовать для хранения данных сервиса :)
  • Игорь Шевченко © (18.04.08 00:08) [24]

    > чей SID не знаю, ибо не знаю как это проверять.


    LookupAccountSid если из программы, у Руссиновича программка была опять же.
 
Конференция "WinAPI" » Как получить унифицированное имя файла?
Есть новые Нет новых   [134432   +20][b:0][p:0.001]