Login
Как узнать UNC-Path в C#?
146
NEW 13.02.07 16:13
Привет,
на сервере стоит программа и коллеги имеющие доступ пользуются ей центрально. Если пользователь скопировал е╦ локально, то программа это должна различать. Пока мне ни чего другого на ум не пришло, как проверить в какой директории используемая программа находится.
Для этого я ищу функцию в C#, которая мне выдаст UNC-Директорию, т.к. логические ссылки не однозначны (к примеру: Environment.CurrentDirectory).
Может кто знает как решить?
на сервере стоит программа и коллеги имеющие доступ пользуются ей центрально. Если пользователь скопировал е╦ локально, то программа это должна различать. Пока мне ни чего другого на ум не пришло, как проверить в какой директории используемая программа находится.
Для этого я ищу функцию в C#, которая мне выдаст UNC-Директорию, т.к. логические ссылки не однозначны (к примеру: Environment.CurrentDirectory).
Может кто знает как решить?
NEW 13.02.07 18:34
in Antwort aifl 13.02.07 16:13
Я не внимательно прочел в первый раз.
В продолжение к предыдущему,
попробуй вот это:
ManagementObject driveInfo = new ManagementObject( path );
string uncPath = string.Format( "{0}", driveInfo[ "ProviderName" ].ToString());
В продолжение к предыдущему,
попробуй вот это:
ManagementObject driveInfo = new ManagementObject( path );
string uncPath = string.Format( "{0}", driveInfo[ "ProviderName" ].ToString());
NEW 14.02.07 10:33
in Antwort Rius 13.02.07 18:34, Zuletzt geändert 14.02.07 10:59 (aifl)
Пишит: "RPC-Server nicht verfügbar" (The RPC Server is Unavailable)...
возможно WNetGetUniversalName решит проблему, буду пробовать...
возможно WNetGetUniversalName решит проблему, буду пробовать...
NEW 14.02.07 13:53
in Antwort aifl 14.02.07 10:33
интерсную задачку подкинул. Спасибо :) Когда-то я делал такое с API- функциями и там было все просто. Вызов GetDriveType() и сразу получаешь информацию какого типа он.
А тут пришлось повозится, запрятали ее будь здоров.
Короче, если я правильно понял и тебе нужно узнать откуда застартовали программу с локального или сетевого лауфверка, то у меня получилось так:
using System.Management;
using System.IO;
string path = Directory.GetDirectoryRoot(Directory.GetCurrentDirectory());
ManagementObject driveInfo = new ManagementObject();
ManagementPath mpath = new ManagementPath(string.Format("Win32_LogicalDisk='{0}'", path.Substring(0,2)));
driveInfo.Path = mpath;
PropertyDataCollection diskProperties = driveInfo.Properties;
string type = diskProperties["DriveType"].Value.ToString();
теперь так если type = "3", то это локальный диск, если "4" - то сетевой.
Подробнее здесь
http://www.dotnet247.com/247reference/msgs/9/47182.aspx
А тут пришлось повозится, запрятали ее будь здоров.
Короче, если я правильно понял и тебе нужно узнать откуда застартовали программу с локального или сетевого лауфверка, то у меня получилось так:
using System.Management;
using System.IO;
string path = Directory.GetDirectoryRoot(Directory.GetCurrentDirectory());
ManagementObject driveInfo = new ManagementObject();
ManagementPath mpath = new ManagementPath(string.Format("Win32_LogicalDisk='{0}'", path.Substring(0,2)));
driveInfo.Path = mpath;
PropertyDataCollection diskProperties = driveInfo.Properties;
string type = diskProperties["DriveType"].Value.ToString();
теперь так если type = "3", то это локальный диск, если "4" - то сетевой.
Подробнее здесь
http://www.dotnet247.com/247reference/msgs/9/47182.aspx
NEW 14.02.07 15:53
in Antwort Rius 14.02.07 13:53, Zuletzt geändert 14.02.07 16:04 (aifl)
:)
Спасибо, теперь могу распознать тип диска! Что я в итоге хотел:
1. создать const string-переменную: szServerPath = "\\MyServer\\Programs\\MyExe".
2. узнать адрес, с которого программа запущена: string szCurAppPath = Environment.CurrentDirectory;
3. сверить их: if( szCurAppPath.Equals(szServerPath) == true )....
Т.е теперь ещё бы узнать, если сетевой, то какое у него UNC-название...
Спасибо, теперь могу распознать тип диска! Что я в итоге хотел:
1. создать const string-переменную: szServerPath = "\\MyServer\\Programs\\MyExe".
2. узнать адрес, с которого программа запущена: string szCurAppPath = Environment.CurrentDirectory;
3. сверить их: if( szCurAppPath.Equals(szServerPath) == true )....
Т.е теперь ещё бы узнать, если сетевой, то какое у него UNC-название...
NEW 14.02.07 16:23
in Antwort aifl 14.02.07 15:53
NEW 14.02.07 16:43
in Antwort aifl 14.02.07 15:53
я бы не засовывал "\\MyServer\\Programs\\MyExe" в константную переменную.
Решение будет не скалируемым. Имя сервера или path могут поменяться.
Тебе не достаточно распознать с какого диска локального или сетвого запущена программа?
У этого обьекта diskProperties из предыдущего примера, есть кроме "DriveType" куча других проперти. Например можно проверять или это сетевой диск не по "DriveType", а по "Description". Для сетевого "Description" будет равна "Network".
Кроме того есть проперти "ProviderName". Вроде бы она должна возвращать UNC-Path. Вот тут об этом http://www.dotnet247.com/247reference/msgs/52/261775.aspx
Я не могу протестировать, т.к. у меня нет прав запустить мой анвендунг с сетевого диска.
Решение будет не скалируемым. Имя сервера или path могут поменяться.
Тебе не достаточно распознать с какого диска локального или сетвого запущена программа?
У этого обьекта diskProperties из предыдущего примера, есть кроме "DriveType" куча других проперти. Например можно проверять или это сетевой диск не по "DriveType", а по "Description". Для сетевого "Description" будет равна "Network".
Кроме того есть проперти "ProviderName". Вроде бы она должна возвращать UNC-Path. Вот тут об этом http://www.dotnet247.com/247reference/msgs/52/261775.aspx
Я не могу протестировать, т.к. у меня нет прав запустить мой анвендунг с сетевого диска.
NEW 14.02.07 16:57
in Antwort Rius 14.02.07 16:46
Я с тобой согласен, решение не элегантно. Если меняется сервер, то константную переменную нужно менять руками.
Программа расчитана на работников нашей фирмы и я являюсь е╦ администратором, т.е она не на продажу.
К сожалению мне не достаточно распознать с какого диска запущена программа т.к. в \\MyServer\\Programs\\MyExe\\Test часто выставляю бета-версию, и она не должна "полноценно" работать.
Программа расчитана на работников нашей фирмы и я являюсь е╦ администратором, т.е она не на продажу.
К сожалению мне не достаточно распознать с какого диска запущена программа т.к. в \\MyServer\\Programs\\MyExe\\Test часто выставляю бета-версию, и она не должна "полноценно" работать.
NEW 14.02.07 17:06
in Antwort Rius 14.02.07 16:43, Zuletzt geändert 15.02.07 11:11 (aifl)
И при Description на английском виндовсе: "Network", а на немецком: "Netzwerkverbindung"... не, 3 или 4 мне больше нравятся :), всё равно спасибо за совет!
NEW 14.02.07 17:25
in Antwort aifl 14.02.07 17:06
15.02.07 08:37
in Antwort Rius 14.02.07 17:25
Кстати, узнать откуда программа запущена лучше так.
System.Reflection.Assembly.GetEntryAssembly().Location
CurrentDirectory в общем случае может показывать куда попало
System.Reflection.Assembly.GetEntryAssembly().Location
CurrentDirectory в общем случае может показывать куда попало
*Ъ...