对不起,如果有更好的地方可以提出这个问题......
我已经为我们的应用添加了一个FTP子系统接口 - 这样我们的脚本就可以从我们的ftp服务器下载一些文件,以确定是否有新版本...
但是当执行此操作时,Windows会发出安全提示 - 是否允许此应用程序...
显然有时会出现在我们的应用窗口下方...
所以,比所有这些混乱更好的是在安装时授权我们的应用程序。但是有办法做到这一点吗?如果没有,那么使用互联网的其他应用程序如何不经常显示此对话框(作为一个明显的例子:Chrome)?
当然,有一种方法可以在安装时标记/注册/授权应用程序,以便在每次尝试检查新版本时绕过此安全警告吗?
我尝试了一些没有有用结果的网络搜索,所以我必须从一个不寻常的方向来解决这个问题?
答案 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);
}
}