0

アプリケーションが 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か?

4

1 に答える 1

2

取得している応答を変更する方法は考えられませんが、いつでも 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ドライブ文字を指定すると、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);
}
于 2013-01-08T20:04:55.723 に答える