使用c#,我如何获得" application . startupathath "返回映射的驱动器路

本文关键字:quot 返回 startupathath 映射 驱动器路 application 何获得 使用 | 更新日期: 2023-09-27 17:51:05

当我的应用程序使用app.manifest时,下面的行设置如下

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

代码

textBox1.Text = Path.Combine(Application.StartupPath, "setupws.exe");

返回"''server'myApp'setupws.exe"

如果我将requestedExecutionLevel更改为"asInvoker",或者完全删除app.manifest,则返回"F:'myApp'setupws.exe"。这正是我需要的。

是否有办法让Application.StartupPath的行为方式,我想和仍然使用requireAdministrator ?

使用c#,我如何获得" application . startupathath "返回映射的驱动器路

我想不出任何方法来改变你得到的响应,但你总是可以尝试将UNC重新映射回本地-要做到这一点,你需要调用底层的Win32调用(C dll调用)使用"平台调用",或"PInvoke";引用win32调用的语法看起来有点像:

[DllImport("mpr.dll", CharSet=CharSet.Auto, SetLastError=true)]
[return:MarshalAs(UnmanagedType.Bool)]
public static extern bool WNetGetConnection(
    [MarshalAs(UnmanagedType.LPTStr)] string localName, 
    [MarshalAs(UnmanagedType.LPTStr)] StringBuilder remoteName, 
    ref int length);

(这是做的是将非托管调用/类型映射到它们的托管等效类型,以及告诉编译器"嘿,我要调用的东西之外还有代码")

WNetGetConnection是一个相当乏味的Windows函数:给它一个驱动器号,如果映射到UNC路径,您将返回一个UNC路径。我们将循环遍历"已知驱动器号",依次将每个驱动器号提供给此调用,如果我们得到与返回的UNC名称和我们试图"反向映射"的路径的任何部分匹配,我们将用相应的驱动器号替换路径的UNC部分,并且我们完成了:

public string GetLocalPathForUnc(string uncName)
{
    var mapped = Environment.GetLogicalDrives().Select(drive => 
    {
        drive = drive.Substring(0,2);
        var buffer = new StringBuilder(0xff);
        int length = 0xff;
        WNetGetConnection(drive, buffer, ref length);
        return new {Drive = drive, Unc = buffer.ToString()};
    });
    var match = mapped
            .Where(ob => 
                 !string.IsNullOrWhiteSpace(ob.Drive) && 
                 !string.IsNullOrWhiteSpace(ob.Unc))
        .FirstOrDefault(ob => uncName.ToLowerInvariant().StartsWith(ob.Unc.ToLowerInvariant()));
    return uncName.Replace(match.Unc, match.Drive);
}
相关文章: