2016-10-31 7 views
0

Visual Studio에서 Small 샌드 박스 프로젝트를 작업 중입니다. 여기 내 코드입니다 :C# Sandbox Environment

namespace Andromeda.PCTools 
{ 
    public partial class Sandbox : MetroForm 
    { 
     private AppDomain sandbox; 

     public Sandbox() 
     { 
      InitializeComponent(); 
     } 

     private void Sandbox_Load(object sender, EventArgs e) 
     { 

     } 

     private void btnAdd_Click(object sender, EventArgs e) 
     { 
      using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "Applications|*.exe", ValidateNames = true, Multiselect = false }) 
      { 
       if (ofd.ShowDialog() == DialogResult.OK) 
       { 
        listBoxItems.Items.Add(ofd.FileName); 

       } 
      } 
     } 

     private void removeSelectedToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      if (listBoxItems.SelectedItems.Count != 0) 
      { 
       while (listBoxItems.SelectedIndex != -1) 
       { 
        listBoxItems.Items.RemoveAt(listBoxItems.SelectedIndex); 
       } 
      } 
     } 

     private void btnLoad_Click(object sender, EventArgs e) 
     { 
      PermissionSet ps = new PermissionSet(PermissionState.None); 
      ps.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution)); 

      AppDomainSetup setup = new AppDomainSetup(); 

      Evidence ev = new Evidence(); 
      //ev.AddHostEvidence(new Zone(SecurityZone.Internet)); 
      PermissionSet internetPS = SecurityManager.GetStandardSandbox(ev); 

      setup.ApplicationBase = Path.GetFullPath(Application.StartupPath); 



      //StrongName fullTrustAssembly = typeof(Sandboxer).Assembly.Evidence.GetHostEvidence<StrongName>(); 

      sandbox = AppDomain.CreateDomain(listBoxItems.SelectedItem.ToString(), ev, setup, ps); 

      try 
      { 
       sandbox.ExecuteAssembly(listBoxItems.SelectedItem.ToString()); 
       btnLoad.Enabled = false; 
       btnUnload.Enabled = true; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("The following error occurred!\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 

     } 

     private void btnUnload_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       AppDomain.Unload(sandbox); 
       btnLoad.Enabled = true; 
       btnUnload.Enabled = false; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("The following error occurred!\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 

     } 

    } 
} 

하지만 난 다음 오류 얻을 :

Exception thrown: 'System.Security.SecurityException' in Andromeda 4.0.exe ("Request for the permission of type 'System.Security.Permissions.FileIOPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.")

+0

오류 * * 어디서 *? 거기에 많은 무관 한 코드가 있습니다. [MCVE] (http://stackoverflow.com/help/mcve)를 참조하십시오. –

+0

실행하려고하는 어셈블리에는 파일 I/O가 관련되어 있습니까? 그렇다면 실제로 그런 일이 일어나지 않을 것이라고 생각하십니까? –

+0

기본적으로 EXE는 장치를 변경 (해치) 할 수없는 환경에서 실행하려고합니다. – Anthony

답변

0

당신은 실행할 수있는 샌드 박스 어셈블리 권한을 부여하고,하지만 당신은 또한 FileIOPermission 권한으로 설정을 추가해야합니다, 따라서 파일 시스템에 액세스 할 수있는 권한을 부여합니다. 다음을 시도하십시오.

ps.AddPermission(new FileIOPermission(PermissionState.Unrestricted)); 

IO 권한을 적절하게 구성하려는 방법을 선택하십시오. 내 예제에서는 무제한이지만 샌드 박스입니다. 약간 잠그도록 선택할 수도 있습니다 :) 필요에 따라 적절한 생성자를 선택하십시오.

+0

여전히 동일한 오류가 발생합니다. – Anthony

+0

감사합니다. 올바른 경로에 나를 넣어주세요. – Anthony

+0

Ah , 그래서 당신은 그것을 알아 낸 것입니까? 멋지다! :) – Amy