C# c语言中的Linkdemand警告#

C# c语言中的Linkdemand警告#,c#,.net,visual-studio,visual-studio-2010,C#,.net,Visual Studio,Visual Studio 2010,我试图在我的DLL中获取Iexplorer.exe的版本。但是每次我都会收到此警告 警告1 CA2122:Microsoft.Security:'ApCkr.IEavailable()'调用具有LinkDemand的'FileVersionInfo.FileMajorPart.get()'。通过进行此调用,“FileVersionInfo.FileMajorPart.get()”将间接暴露给用户代码。查看以下调用堆栈,这些调用堆栈可能会公开规避安全保护的方法: 在MSDN(安全权限)和FALG中

我试图在我的DLL中获取Iexplorer.exe的版本。但是每次我都会收到此警告

警告1 CA2122:Microsoft.Security:'ApCkr.IEavailable()'调用具有LinkDemand的'FileVersionInfo.FileMajorPart.get()'。通过进行此调用,“FileVersionInfo.FileMajorPart.get()”将间接暴露给用户代码。查看以下调用堆栈,这些调用堆栈可能会公开规避安全保护的方法:

在MSDN(安全权限)和FALG中进行了大量搜索之后,我仍然不知道如何消除这个错误。我试过了

SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
但也无法让它工作

任何帮助都将不胜感激

    #region IExplore

    public string IEavailable()
    {
        bool IEversion;

        FileVersionInfo.GetVersionInfo("C:\\program files\\\\Internet Explorer\\iexplore.exe");
        FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo("C:\\program files\\\\Internet Explorer\\iexplore.exe");
        int a = myFileVersionInfo.FileMajorPart;
        if (a < 8)
        {
            IEversion = false;
        }
        else
        {
            IEversion = true;
        }
        return IEversion.ToString();
    }
    #endregion
#地区探索
公共字符串可用()
{
bool-IEversion;
FileVersionInfo.GetVersionInfo(“C:\\ProgramFiles\\\\Internet Explorer\\iexplore.exe”);
FileVersionInfo myFileVersionInfo=FileVersionInfo.GetVersionInfo(“C:\\program files\\\\Internet Explorer\\iexplore.exe”);
int a=myFileVersionInfo.FileMajorPart;
if(a<8)
{
IEversion=false;
}
其他的
{
IEversion=true;
}
返回IEversion.ToString();
}
#端区

这不是错误,而是警告。解释LinkDemand是什么的文档。

这是它所讨论的FileVersionInfo类上的LinkDemand属性:

[PermissionSet(SecurityAction.LinkDemand, Name="FullTrust")]
这在MSDN文章中有很好的说明,但并不总是很容易从FxCop消息中递归。我个人觉得Reflector很容易解决这个问题

链接请求是在运行时检查的非常便宜的请求。它在即时编译时执行,只执行一次,并且只检查直接调用方的权限。发生可能的安全泄漏是因为以后其他代码可能会调用您的属性getter。这样的代码不会得到相同的请求检查,因为您的属性缺少该属性,并且已经jitted。您必须应用相同的安全属性

只有当这样的代码在没有完全信任的情况下运行时,这才是一个问题。很难想出这样的场景,您必须创建自己的沙盒,并将您的属性公开给这样的沙盒代码。如果你想知道是否能够检查DLL版本的安全性:那么,准确地知道程序使用的DLL版本对于找出攻击向量是非常重要的。
FxCop还不够聪明,无法检测此类场景。它确实是一种工具,只会发出警告,提醒你可能忽略的事情。而你可能做到了。CAS在其他方面很难理解,我自己也很挣扎。其他人也因此在.NET4中被弃用,取而代之的是安全性沙箱模型。明智之举,令人费解的安全性是不安全的。

MSDN的例子我无法理解。请您在这里简单解释一下。在您试图消除警告之前:您是否进行了彻底的安全审查?您是否确保链接请求方法的间接公开是安全的,即使由部分受信任的代码间接调用也是安全的?警告是为了保护你的安全。不要问“如何关闭烟雾探测器?”直到你确定这是一个假警报;关闭一个正常工作的烟雾探测器是烧毁大楼的好方法。@EricLippert我会调查一下。此外,我不认为一个简单的文件版本查询会造成任何重大威胁