Это мой код:Sandboxing ненадежного код в C#, Разрешение безопасности, похоже, не работает
System.Security.PermissionSet PS = new System.Security.PermissionSet(PermissionState.None);
PS.AddPermission(new FileIOPermission(FileIOPermissionAccess.AllAccess,Path));
PS.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
AppDomainSetup ADS = new AppDomainSetup();
ADS.ApplicationBase= Path;
AppDomain domain = AppDomain.CreateDomain("Pluging", null, ADS, PS, null);
Assembly asm = Assembly.LoadFrom(Path + "MacroBase.dll");
domain.Load(asm.FullName);
MacroBase.MacroBase em = (MacroBase.MacroBase)domain.CreateInstanceAndUnwrap(asm.FullName, "MacroBase.MacroBase");
em.Application(1);
параметр Path имеет адрес floder, который содержит DLL. Прямо сейчас это «D: \ Program Projects \ Server3 \ Macros \ c7b465b2-8314-4c7e-be3c-10c0185b4ac6» копия файла macrobase.dll находится внутри папки Guid. Appdomain загружает эту dll и запускает метод Application.
Я ожидал, что последняя строка не будет иметь доступ к C: \ вследствие FileIOPermissionAccess, который был применен в начале, но упомянутый метод:
MacroBase.Application(int i)
{
System.IO.File.ReadAllBytes("c:\\test1_V.103.xls");
}
работает, как если бы он был полностью неограниченным.
на основе этой статьи от Microsoft: How to: Run Partially Trusted Code in a Sandbox Я также попытался следующий формат без каких-либо лучших результатов (это может получить доступ к C :):
System.Security.PermissionSet PS = new System.Security.PermissionSet(PermissionState.None);
PS.AddPermission(new FileIOPermission(FileIOPermissionAccess.AllAccess,Path));
PS.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
AppDomainSetup ADS = new AppDomainSetup();
ADS.ApplicationBase= Path;
AppDomain domain = AppDomain.CreateDomain("Pluging", null, ADS, PS, null);
Assembly asm = Assembly.LoadFrom(Path + "MacroBase.dll");
domain.Load(asm.FullName);
System.Runtime.Remoting.ObjectHandle handle = Activator.CreateInstanceFrom(domain, Path + "MacroBase.dll", "MacroBase.MacroBase");
MacroBase.MacroBase m = (MacroBase.MacroBase)handle.Unwrap();
m.Application(1);
MacroBase.Macrobase является заполнителем для будущих макросов. Он помещается внутри dll macrobase.dll. Сейчас он содержит только фиктивный код:
namespace MacroBase
{
[Serializable]
public class MacroBase
{
public void Application(int i)
{
List<int> i1 = new System.Collections.Generic.List<int>() { 1,2,3,4};
System.IO.File.ReadAllBytes("c:\\test1_V.103.xls");
switch(i)
{
case 0:
break;
case 1:
break;
default:
break;
}
}
}
}
Но разве вы просто не добавили 'FileIOPermissionAccess.AllAccess' и' SecurityPermissionFlag.Execution', сразу после этой первой строки кода? –
Какова ценность 'Path'? в вашей строке 'PS.AddPermission (новый FileIOPermission (FileIOPermissionAccess.AllAccess, Path));' – DWright
Показать определение 'MacroBase.MacroBase'. – PetSerAl