gpt4 book ai didi

c# - 请求失败的 .net 程序集

转载 作者:太空宇宙 更新时间:2023-11-03 16:25:58 25 4
gpt4 key购买 nike

我有一个使用插件的应用程序。装配链看起来像这样:

应用程序 -> A -> B -> A -> B

程序集是“App”(正在运行的应用程序)、“A” - 程序集中的链接和“B” - 加载了 Assembly.LoadFile 或 Assembly.LoadFrom 的程序集(两种方法都会出现相同的错误) .

它正在抛出安全异常,试图 LinkDemand 不受限制的权限。异常发生在 A 第二次调用 B 时。 B 是 NOT 签名程序集(因此我从我读过的内容中收集到的不是强命名程序集)。我还尝试将 [assembly: AllowPartiallyTrustedCallers] 属性放在 B 的 attribute.cs 文件中(并尝试将其放在所有程序集上)。我什至尝试过为不受限制的权限设置权限断言,尽管从我读到的内容来看,这对 LinkDemand 应该没有影响。

我知道程序集降低了权限(猜测这与通过程序集加载它有关)。但是,我读过的所有内容似乎都表明 LinkDemand 仅检查调用权限,因此我不确定为什么第二次失败而不是第一次失败。

我很困惑,因为:a.为什么它第一次没有失败,b。为什么会发生这种情况(不使用强命名程序集 afaik),以及 c。为什么不添加 APTC 属性来解决问题。

需要说明的是,我对任何程序集中的任何方法都没有安全需求属性(不包括 LinkDemands)。我在程序集 A 中确实有一些权限断言,但我看不出这会如何影响任何事情。

[System.Security.SecurityException] {"Request failed."} System.Security.SecurityException
Action LinkDemand System.Security.Permissions.SecurityAction
Demanded {<PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true"/> } object {System.Security.PermissionSet}
DenySetInstance null object
FailedAssemblyInfo {B, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null} System.Reflection.AssemblyName
FirstPermissionThatFailed null System.Security.IPermission
GrantedSet "<PermissionSet class=\"System.Security.PermissionSet\"\r\nversion=\"1\">\r\n<IPermission class=\"System.Security.Permissions.FileDialogPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\"\r\nversion=\"1\"\r\nAccess=\"Open\"/>\r\n<IPermission class=\"System.Security.Permissions.IsolatedStorageFilePermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\"\r\nversion=\"1\"\r\nAllowed=\"ApplicationIsolationByUser\"\r\nUserQuota=\"512000\"/>\r\n<IPermission class=\"System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\"\r\nversion=\"1\"\r\nFlags=\"Execution\"/>\r\n<IPermission class=\"System.Security.Permissions.UIPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\"\r\nversion=\"1\"\r\nWindow=\"SafeTopLevelWindows\"\r\nClipboard=\"OwnClipboard\"/>\r\n<IPermission class=\"System.Security.Permissions.UrlIdentityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\"\r\nversion=\"1\"\r\nUrl=\"file:///Z:/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/B.dll\"/>\r\n<IPermission class=\"System.Security.Permissions.ZoneIdentityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\"\r\nversion=\"1\"\r\nZone=\"Internet\"/>\r\n<IPermission class=\"System.Drawing.Printing.PrintingPermission, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\"\r\nversion=\"1\"\r\nLevel=\"SafePrinting\"/>\r\n</PermissionSet>\r\n" string
Method null System.Reflection.MethodInfo
PermissionState "<PermissionSet class=\"System.Security.PermissionSet\"\r\nversion=\"1\"\r\nUnrestricted=\"true\"/>\r\n" string
PermissionType {Name = "PermissionSet" FullName = "System.Security.PermissionSet"} System.Type {System.RuntimeType}
PermitOnlySetInstance null object
RefusedSet "" string
Url "file:///Z:/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/B.dll" string
Zone Internet System.Security.SecurityZone

正如 Hans Passant 所建议的,这似乎与安全区域是互联网有关。从那以后,我尝试了以下 caspol 命令无济于事:

caspol -m -ag 1.2 -url file://z:/* FullTrust
caspol -m -ag 1.2 -url file://\\sam-crazycasta.dyndns.org/crazycasta/* FullTrust
caspol -m -ag 1.3 -url file://z:/* FullTrust
caspol -m -ag 1.3 -url file://\\sam-crazycasta.dyndns.org/crazycasta/* FullTrust

但是,在本地复制文件确实有效。我想要一个允许我从网络驱动器等运行的通用解决方案。最好是我可以在程序中执行的操作,这样用户就不需要知道任何问题。

编辑 1:我从 MSDN 中获取了一些代码来打印策略,这就是我得到的,在我看来 FullTrust 应该被授予(最后一行是问题异常):

Policy Level Enterprise:
FullTrust
LocalIntranet
Internet
SkipVerification
Execution
Nothing
Everything
Policy Level Machine:
Nothing
FullTrust
LocalIntranet
Internet
SkipVerification
Execution
Everything
Policy Level User:
FullTrust
LocalIntranet
Internet
SkipVerification
Execution
Nothing
Everything
A first chance exception of type 'System.Security.SecurityException' occurred in mscorlib.dll

无论是从出现故障的网络运行,还是从正常运行的硬盘驱动器运行,此打印输出都完全相同。

我还尝试添加以下函数并在调用失败之前调用它:

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.LinkDemand, Unrestricted = true)]
public void dummy() {}

由于它的链接要求不受限制的权限,我不明白为什么这个功能有效而另一个功能无效。

最佳答案

我试图终止程序集 B 中的一个进程。这只是部分答案。我仍然感到困惑,因为调试器指向程序集 A 中调用程序集 B 的行,而不是程序集 B 中我试图终止进程的行。这是一些演示问题的代码,如果有人能告诉我我应该如何知道异常来自程序集 B,我会接受它作为答案。

程序集 A:

using System;
using System.Text;

namespace A
{
public interface IA
{
void A();
void B();
}

public class A
{
public IA a;

public A(IA _a)
{
a = _a;
}

public void callA()
{
Console.WriteLine("callA called, calling A.");
a.A();
}

public void callB()
{
Console.WriteLine("callB called, calling B.");
a.B();
}
}
}

程序集 B:

using System;
using System.Text;

using System.Diagnostics;

namespace B
{
public class _B : A.IA
{
public A.A a;

public _B(A.A _a)
{
a = _a;
}

#region IA Members

public void A()
{
Console.WriteLine("A called, calling callB.");
a.callB();
}

public void B()
{
Console.WriteLine("B called.");
Process.GetCurrentProcess().Kill();
}

#endregion
}
}

应用:

using System;
using System.Text;

using System.Reflection;

namespace App
{
class Program
{
static void Main(string[] args)
{
A.IA ia;
Assembly b;
Type tb;
A.A a;

a = new A.A(null);
b = Assembly.LoadFrom("../../../B/bin/Debug/B.dll");
tb = b.GetType("B._B");
ia = (A.IA)tb.GetConstructor(new Type[] { typeof(A.A) }).Invoke(new object[]{a});
a.a = ia;
a.callA();
}
}
}

关于c# - 请求失败的 .net 程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12574136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com