Создание размещенного домена приложений CLR с полными разрешениями доверия, включая сетевые права - PullRequest
7 голосов
/ 02 февраля 2011

Мне нужно разместить среду выполнения .NET в неуправляемом процессе. У меня есть код, который работает для загрузки среды выполнения через COM, и я могу загружать сборки в AppDomain и выполнять код просто отлично.

Однако я сталкиваюсь с проблемами с приложениями, размещенными на общем сетевом ресурсе, и мне приходится менять политику приложений, чтобы заставить их работать, что не вариант. Поэтому я хотел бы установить неограниченный уровень разрешений для основного AppDomain среды выполнения.

Может кто-нибудь привести пример того, как установить уровень политики AppDomain? Я не могу понять, как создавать экземпляры необходимых классов из неуправляемого кода для создания PolicyLevel и связанных объектов и установки политики. По сути, я не знаю, что включает в себя / namespace ссылки, мне нужно, чтобы это работало из кода C ++, который я использую.

Вот код, который у меня есть на данный момент:

/// Starts up the CLR and creates a Default AppDomain
DWORD WINAPI ClrLoad(char *ErrorMessage, DWORD *dwErrorSize)
{
    if (spDefAppDomain)
        return 1;


    //Retrieve a pointer to the ICorRuntimeHost interface
    HRESULT hr = CorBindToRuntimeEx(
                    ClrVersion, //Retrieve latest version by default
                    L"wks", //Request a WorkStation build of the CLR
                    STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN | STARTUP_CONCURRENT_GC, 
                    CLSID_CorRuntimeHost,
                    IID_ICorRuntimeHost,
                    (void**)&spRuntimeHost
                    );

    if (FAILED(hr)) 
    {
        *dwErrorSize = SetError(hr,ErrorMessage);   
        return hr;
    }

    //Start the CLR
    hr = spRuntimeHost->Start();

    if (FAILED(hr))
        return hr;

    CComPtr<IUnknown> pUnk;

    //Retrieve the IUnknown default AppDomain
    //hr = spRuntimeHost->GetDefaultDomain(&pUnk);
    //if (FAILED(hr)) 
    //  return hr;


    WCHAR domainId[50];
    swprintf(domainId,L"%s_%i",L"wwDotNetBridge",GetTickCount());
    hr = spRuntimeHost->CreateDomain(domainId,NULL,&pUnk);  

    hr = pUnk->QueryInterface(&spDefAppDomain.p);
    if (FAILED(hr)) 
        return hr;

      // // Create a new AppDomain PolicyLevel.
   //PolicyLevel polLevel = PolicyLevel:: CreateAppDomainLevel();

   //// Create a new, empty permission set.
   // PermissionSet permSet = gcnew PermissionSet( PermissionState::Unrestricted);

   //// Add permission to execute code to the permission set.
   //permSet->AddPermission( gcnew SecurityPermission( SecurityPermissionFlag::Execution ) );

   ////// Give the policy level's root code group a new policy statement based
   ////// on the new permission set.
   ////polLevel->RootCodeGroup->PolicyStatement = gcnew PolicyStatement( permSet );

   //// Give the new policy level to the application domain.
   //spDefAppdomain->SetAppDomainPolicy( polLevel );



    return 1;
}

Я взял некоторый пример кода (с комментариями), который, кажется, делает то, что мне нужно, но я не могу понять, какие ссылки lib / include мне нужны, чтобы заставить работать ссылки на типы для PermissionSet и PolicyLevel.

Любые идеи высоко ценятся ...

1 Ответ

2 голосов
/ 29 ноября 2012

Я думаю, что вам нужно использовать "нетривиальный" метод создания AppDomain, чтобы достичь любой из этих добродетелей:

  • CreateDomainSetup(IUnknown** pAppDomainSetup), что даст вамобратно IAppDomainSetup экземпляр.
  • Заполните это соответствующим образом (я думаю, что там есть все необходимое для политики)
  • Используйте CreateDomainEx, передавая ваш инициализированный экземпляр установки в качестве второго параметра
  • Прибыль?

Ссылки:

...