【问题标题】:get local path regardless of how user browsed to it无论用户如何浏览它,都获取本地路径
【发布时间】:2014-08-28 18:43:33
【问题描述】:

我有一个我已经构建的应用程序,我已将它放在服务器上的共享驱动器上,以便将其分发给其他用户。但是,我希望应用程序检查它的启动位置,如果它直接在共享上启动,弹出一条消息,内容如下:“应用程序无法从该位置运行。你想将它安装在而不是你的本地计算机?”

我遇到的问题如下:因为用户通过浏览共享来启动它,所以应用程序中的 CurrentDomain 与用户浏览共享的方式有关。因此,基本上不可能(这是我的问题:)确定应用程序是否正在服务器上启动!

如果用户通过键入手动浏览共享:
\\SERVER\SharedFolder\App\MyApp.exe
那么执行程序集总是返回 UNC 共享 (\...)...

但是,如果用户正在远程访问服务器,则路径将是这个:
D:\Shares\MyAppSharedFolder\Loader\MyApp.exe

但是,如果用户将 SharedFolder 映射到他的本地驱动器 Z:
Z:\App\MyApp.exe
那么返回值就是Z:\值。

所以我的问题是:有没有一种简单的方法可以始终返回相同的值,而不管用户在应用启动后如何浏览它?

我试过这个解决方案:
http://briancaos.wordpress.com/2009/03/05/get-local-path-from-unc-path/
但这仅适用于路径为 UNC 共享格式 (\ ...)

那么,获取正在运行的 TRUE 本地路径的 .exe 的正确方法是什么,无论它是在哪里运行或它是如何被浏览到的?

【问题讨论】:

  • How can I determine if a given drive letter is a local/mapped/usb drive? 的可能副本。问题的根源在于,驱动器是否是本地驱动器,其原因是辅助性的。
  • @ErikPhilips 我不同意...我想获得执行程序集的本地路径,无论它在用户域上运行,或者他/她如何浏览它...如果答案是“你不能也必须考虑所有场景”,然后我会用这个答案来帮助我构建那段(更大的)代码,但是有没有办法在另一个中轻松获得本地/实际装配路径方式?
  • 那你是在问如何让Assembly.GetExecutingAssembly() 执行Location?我也不知道User Domain 是什么意思,并且知道应用程序的执行方式对根本问题没有用(因为如果我在桌面上创建一个快捷方式,即浏览到的位置,以启动应用程序,但现在在哪里它是从)执行的。
  • 是的,但实际上是服务器本地的...我现在正在使用该代码位,例如:如果我运行我的应用程序和 msgbox 该代码的结果,我浏览到它在资源管理器中使用\\路径,我得到\\路径回来,如果我从我的映射位置运行它到Z:,我得到Z:回来......有什么东西可以给我实际的路径在哪里它真的像 D:\ ... 一样位于服务器上?
  • 我做的第一条评论会告诉你它是否是本地驱动器。 ALL UNC 路径根据定义是远程的,即使共享位于本地设备上,也会使用网络堆栈来执行。

标签: c# .net-assembly unc


【解决方案1】:

好的,这就是我最终要做的……不,这个问题没有答案/不是重复的。

简而言之,我的问题的答案是这样的:
它无法完成/没有简单且内置的方法可以知道应用程序在何处真正运行,而不考虑“用户域/配置文件/上下文”。

因此,必须以以下方式(伪编码)实现更复杂和全面的解决方案:

使 RunLocation = GetEntryAssembly! IF RunLocation == ServerLocationAsUNC 或 LocalServerLocation { //所以在这里,如果位置是 \\SERVER\SharedFolder\App\ OR D:\Shares\MyAppSharedFolder\Loader\ 提示安装位置/不要运行! } 别的 { IF RunLocation 以“\\”开头 { 从 RunLocation 中提取服务器名称 获取该服务器的 IP 地址 IF RunLocationIP == KnownServerIP { 提示安装位置/不要运行! } 别的 { 允许运行! } } ELSE(如果 RunLocation 不以“\\”开头) { 获取 RunLocation 的 DriveInfo(例如:“E:\”) 如果 DriveInfo 不是网络位置 { 允许运行! } 别的 { 使用 ManagementObject,获取该 DriveInfo 的 UNC 路径 从 UNCPath 中提取服务器名称 获取该服务器的 IP 地址 IF DriveLocationIP == KnownServerIP { 提示安装位置/不要运行! } 别的 { 允许运行! } } } }

这就是伪代码版本...

这是我最终构建的实际方法,用于检查并在需要它的任何地方使用它...请记住,这并非完美无缺(例如,如果本地 PC 具有相同的预期本地服务器路径并且被选中,它会在不应该的时候提示安装位置,我真的不介意自己),它是为我的需要而构建的,所以我在那里有一些额外的检查(比如,不能是桌面)您可能不需要...但无论如何,这是实际的编码版本。

    private enum I_Am
    {
        OnTheServer,
        OnTheLocalPC
    }

    /// <summary>
    /// This method returns whether or not the application is being run at an appropriate location.
    /// </summary>
    /// <returns>Enum I_Am - Either: I_Am.OnTheServer OR I_Am.OnTheLocalPC</returns>
    private I_Am CheckLocation()
    {
        //decalre local vars...
        string bs = Path.DirectorySeparatorChar.ToString();
        string dbs = bs +bs;
        string dir = MyBaseDir;
        I_Am retval = I_Am.OnTheServer;

        //if run location is the UNC Share Server Path OR the Expected Local Server Path, or the Desktop or at the Root of a drive
        //consider this a server/invalid run location.
        if (dir == ServerBaseDir ||
            dir == LocalServerBaseDir ||
            dir == DesktopDir ||
            IsRootDrive(dir))
        {
            retval = I_Am.OnTheServer;
        }
        else
        {
            //if the location is a UNC path entered by the user (e.g.: "\\ServerName")
            if (dir.StartsWith(dbs))
            {
                //extract the server name from the path
                dir = dir.Remove(0, 2);
                List<string> parts = dir.Split(new string[] { bs }, StringSplitOptions.None).ToList();
                string servername = parts[0];
                //get the list of possible IP addresses for that server
                System.Net.IPHostEntry server = System.Net.Dns.GetHostEntry(servername);
                //if that list of IPs contains our distribution server, consider this a server/invalid run location.
                //else, all good/allow to run!
                if (server.AddressList.Contains(System.Net.IPAddress.Parse(ServerIP)))
                    retval = I_Am.OnTheServer;
                else
                    retval = I_Am.OnTheLocalPC;

            }
            else
            {
                //if this is a local drive, it could be mapped to a share/network location which we must check)

                //get the drive info for the drive...
                DriveInfo drive = new DriveInfo(dir[0].ToString());
                //if it's NOT a network drive, all good/allow to run!
                if (drive.DriveType != DriveType.Network)
                {
                    return I_Am.OnTheLocalPC;
                }
                else
                {
                    //if this is a network drive, we now have to check the UNC to IP mapping again...

                    //get the UNC path from the ManagementObject...
                    ManagementObject mo = new ManagementObject();
                    mo.Path = new ManagementPath(string.Format("Win32_LogicalDisk='{0}'", drive.Name));
                    dir = Convert.ToString(mo["ProviderName"]);

                    //extract the server name from the path
                    dir = dir.Remove(0, 2);
                    List<string> parts = dir.Split(new string[] { bs }, StringSplitOptions.None).ToList();
                    string servername = parts[0];
                    //get the list of possible IP addresses for that server
                    System.Net.IPHostEntry server = System.Net.Dns.GetHostEntry(servername);
                    //if that list of IPs contains our distribution server, consider this a server/invalid run location.
                    //else, all good/allow to run!
                    if (server.AddressList.Contains(System.Net.IPAddress.Parse(ServerIP)))
                        retval = I_Am.OnTheServer;
                    else
                        retval = I_Am.OnTheLocalPC;
                }
            }
        }

        return retval;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2021-03-31
    • 2014-10-31
    • 1970-01-01
    相关资源
    最近更新 更多