8

firewallAPI.dllルールを追加するために使用してみました。以下で説明するように、calc.exe(またはその他のファイル)に対しては正常に機能しますがmsdtc.exe、次の例外で失敗します。

System.IO.FileNotFoundException: '指定されたファイルが見つかりません。(HRESULT からの例外: 0x80070002)」

例:

static void Main(string[] args)
{
    var manager = GetFirewallManager();
    if (manager.LocalPolicy.CurrentProfile.FirewallEnabled)
    {
        var path = @"C:\Windows\System32\calc.exe";
        //var path = @"C:\Windows\System32\msdtc.exe"; // System.IO.FileNotFoundException: 'The system cannot find the file specified.
        AuthorizeApplication("Test", path, NET_FW_SCOPE_.NET_FW_SCOPE_ALL, NET_FW_IP_VERSION_.NET_FW_IP_VERSION_ANY);
    }
}

private const string CLSID_FIREWALL_MANAGER =
    "{304CE942-6E39-40D8-943A-B913C40C9CD4}";

private static NetFwTypeLib.INetFwMgr GetFirewallManager()
{
    Type objectType = Type.GetTypeFromCLSID(
        new Guid(CLSID_FIREWALL_MANAGER));
    return Activator.CreateInstance(objectType)
        as NetFwTypeLib.INetFwMgr;
}

private const string PROGID_AUTHORIZED_APPLICATION =
    "HNetCfg.FwAuthorizedApplication";
public static bool AuthorizeApplication(string title, string applicationPath,
    NET_FW_SCOPE_ scope, NET_FW_IP_VERSION_ ipVersion)
{
    // Create the type from prog id
    Type type = Type.GetTypeFromProgID(PROGID_AUTHORIZED_APPLICATION);
    INetFwAuthorizedApplication auth = Activator.CreateInstance(type)
        as INetFwAuthorizedApplication;
    auth.Name = title;
    auth.ProcessImageFileName = applicationPath;
    auth.Scope = scope;
    auth.IpVersion = ipVersion;
    auth.Enabled = true;

    INetFwMgr manager = GetFirewallManager();
    manager.LocalPolicy.CurrentProfile.AuthorizedApplications.Add(auth);
    return true;
}

注: フォルダーを確認したところ、ファイルが適切に配置されていることがわかりました...分散トランザクション コーディネーターのファイアウォール ルールを追加するのを手伝ってくれる人はいますか? 別のファイル (msdtc.exe ではない) をファイアウォールに追加してみてはいかがでしょうか。

4

1 に答える 1

8

[プロジェクト] > [プロパティ] > [ビルド] タブで、[32 ビットを優先] チェックボックスのチェックを外します。msdtc.exe の 32 ビット バージョンはありません。

ファイル システム リダイレクタが FileNotFoundException を引き起こした理由については、この MSDN の記事で詳しく説明されています。

于 2017-06-05T12:49:44.897 に答える