有没有办法预先授权Windows应用程序进行互联网访问?

时间:2015-10-12 16:30:08

标签: windows sockets security ftp

对不起,如果有更好的地方可以提出这个问题......

我已经为我们的应用添加了一个FTP子系统接口 - 这样我们的脚本就可以从我们的ftp服务器下载一些文件,以确定是否有新版本...

但是当执行此操作时,Windows会发出安全提示 - 是否允许此应用程序...

显然有时会出现在我们的应用窗口下方...

所以,比所有这些混乱更好的是在安装时授权我们的应用程序。但是有办法做到这一点吗?如果没有,那么使用互联网的其他应用程序如何不经常显示此对话框(作为一个明显的例子:Chrome)?

当然,有一种方法可以在安装时标记/注册/授权应用程序,以便在每次尝试检查新版本时绕过此安全警告吗?

我尝试了一些没有有用结果的网络搜索,所以我必须从一个不寻常的方向来解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果其他人正在寻找解决方案 - 这是我提出的核心内容:

CComPtr<INetFwProfile> GetCurrentFirewallProfile()
{
    // we need the manager...
    CComPtr<INetFwMgr> pMgr;
    HRESULT hr = CoCreateInstance(__uuidof(NetFwMgr), nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pMgr));
    if (FAILED(hr))
        throw CComException(_T("Unable to create INetFwMgr instance"), hr);

    // ...to get the current policy...
    CComPtr<INetFwPolicy> pPolicy;
    hr = pMgr->get_LocalPolicy(&pPolicy);
    if (FAILED(hr))
        throw CComException(_T("Unable to obtain the INetFwPolicy from the INetFwMgr"), hr);

    // ...to get the current profile
    CComPtr<INetFwProfile> pProfile;
    hr = pPolicy->get_CurrentProfile(&pProfile);
    if (FAILED(hr))
        throw CComException(_T("Unable to obtain the INetFwProfile from the INetFwPolicy"), hr);

    return pProfile;
}

void AuthorizeAppInWindowsFirewall(CComPtr<INetFwProfile> pProfile, const CString executable, const CString name)
{
    // check if this app is already listed
    CComPtr<INetFwAuthorizedApplications> pApps;
    HRESULT hr = pProfile->get_AuthorizedApplications(&pApps);
    if (FAILED(hr))
        throw CComException(_T("Unable to obtain the INetFwAuthorizedApplications from the INetFwProfile"), hr);

    // allocate a com string for our app name
    CComBSTR bstrExecutable(executable);

    CComPtr<INetFwAuthorizedApplication> pApp;
    hr = pApps->Item(bstrExecutable, &pApp);
    if (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND))
    {
        // create one for our app
        hr = CoCreateInstance(__uuidof(NetFwAuthorizedApplication), nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pApp));
        if (FAILED(hr))
            throw CComException(_T("Unable to create INetFwAuthorizedApplication instance"), hr);

        // Set the file name
        hr = pApp->put_ProcessImageFileName(bstrExecutable);
        if (FAILED(hr))
            throw CComException(_T("INetFwAuthorizedApplication::put_ProcessImageFileName failed:"), hr);

        // set the application friendly name
        CComBSTR bstrName(name);
        hr = pApp->put_Name(bstrName);
        if (FAILED(hr))
            throw CComException(_T("INetFwAuthorizedApplication::put_Name failed:"), hr);

        // add to list
        hr = pApps->Add(pApp);
        if (FAILED(hr))
            throw CComException(_T("INetFwAuthorizedApplications::Add failed:"), hr);
    }
    else if (FAILED(hr))
        throw CComException(_T("INetFwAuthorizedApplications::Item failed:"), hr);

    // it's already in the list - ensure it is enabled
    VARIANT_BOOL bEnabled;
    hr = pApp->get_Enabled(&bEnabled);
    if (FAILED(hr))
        throw CComException(_T("INetFwAuthorizedApplication::get_Enabled failed:"), hr);

    // not enabled?
    if (bEnabled == VARIANT_FALSE)
    {
        // disabled - let's attempt to enable it!
        hr = pApp->put_Enabled(VARIANT_TRUE);
        if (FAILED(hr))
            throw CComException(_T("INetFwAuthorizedApplication::put_Enabled failed:"), hr);
    }
}