更新:2007 年 11 月
最小授权集确定工具 (Permcalc.exe) 用于估算在访问程序集的公共入口点时必须为调用方授予的权限。此工具是 .NET Framework 2.0 版中的新工具。旨在供高级用户使用。
PermCalc [options] assemblyName [assemblyDependencyName…]
参数
选项 |
说明 |
|---|---|
-CleanCache |
重新创建所有缓存文件。 |
-HostProtection |
报告 HostProtectionAttribute 受保护的类别的有关信息。 |
-Internet |
在无法准确确定权限值的情况下,使用 Internet 区域权限作为估算值。默认做法是高估权限要求,在无法确定权限值的情况下,使用无限制的权限状态。 |
-Out fileName |
将输出定向到 fileName。默认为 assemblyName.PermCalc.xml,如果指定了 -Sandbox 选项,则为 sandbox.PermCalc.xml。 |
-Sandbox |
报告可在其中运行应用程序的最低权限沙盒,而不是报告入口点调用方所需的权限。 |
-Show |
在完成时显示输出文件。 |
-Stacks |
在输出中包括调用堆栈以显示原始权限要求。 |
-Under |
在无法准确确定权限值的情况下,试图低估权限要求。默认做法是在无法确定权限值时高估权限要求。 |
-? |
显示用法信息。 |
参数 |
说明 |
|---|---|
assemblyName |
要为其计算权限的程序集。 |
assemblyDependencyName |
assemblyName 所依赖的程序集。 |
备注
最小授权集确定工具通过检查所有应用程序程序集和依赖项程序集适用的所有代码路径,来计算运行应用程序所需的最低权限集。该工具按应用程序程序集返回权限集。
从应用程序的入口点开始,该工具跟踪应用程序调用的所有应用程序程序集以及共享库和系统库中的所有代码路径。该工具维护一个模拟调用堆栈,堆栈中包含代码路径跟踪中所涉及的所有程序集。对于每一个代码路径跟踪,该工具将检查是否存在声明性要求、链接要求和声明性堆栈审核修饰符。由于必须在编译时已知声明性安全操作中使用的所有权限状态,因此可以准确地计算出所有声明性安全操作对应用程序程序集的影响。例如,如果使用声明性要求,则将使用所要求的权限集更新调用堆栈中该点的每一个程序集的最低授予权限集。如果在模拟调用堆栈中找到声明性断言,则对于调用堆栈中位于断言上方的所有程序集,将只更新所断言的权限集和所要求的权限集之间的交集。同样地,如果找到链接要求,则只有在模拟调用堆栈中位于链接要求点上方的调用方,才会使用所请求的权限集进行更新。
代码路径跟踪中的部分跟踪是从应用程序的主入口点方法开始、通过各个方法的 Microsoft 中间语言 (MSIL) 执行的。如果在方法 MSIL 跟踪中找到命令性权限集操作,则将对各个程序集运行以下更新算法:
如果可以静态确定在命令性要求、链接要求、断言、只允许或拒绝中使用的权限状态,并且确认该状态不依赖于运行时的任何可用状态,则可以确定此类安全操作对应用程序程序集的影响,并可以计算出声明性安全操作对所有已配置程序集的最低授予权限集的影响。
如果无法静态确定在命令性安全操作中使用的权限集的状态,则假定使用无限制的权限状态,例如,无限制的安全权限或无限制的文件 IO 读取权限。在某些情况下,这可能会导致高估运行应用程序所需的权限。使用 -Under 选项可以重写此默认行为。
如果在一个方法中有多个代码路径,并且某些路径具有不同的安全操作批注,由于该工具可能无法确定应用程序在运行时将采用方法中的哪一个代码路径,因此将使用要求的并集和断言的交集。
根据程序集及其依赖项的大小和复杂程度,该工具执行一次全面的分析可能需要花费数分钟的时间。
示例
通过在 SDK 命令提示 窗口中键入相应的命令,并使用您自己的文件名替换示例中的文件名,可以执行以下示例。
下面的命令可以重新创建所有缓存文件,并包括 mylib.dll 程序集的调用堆栈。该命令在默认的 XML 文件查看器中显示输出。
Permcalc.exe -cleancache -stacks -show mylib.dll
下面的命令可以报告运行 myapp.exe 应用程序所需的最低权限沙盒。该命令在默认的 XML 文件查看器中显示输出。目标文件为 myapp.exe,依赖文件为 mydep1.dll 和 mydep2.dll。
Permcalc.exe -sandbox -show myapp.exe mydep1.dll mydep2.dll