Создание размещенного домена приложений CLR с полными разрешениями доверия, включая сетевые права
Мне нужно разместить среду выполнения.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 ответ
Я думаю, что вам нужно использовать "нетривиальный" метод создания AppDomain
для того, чтобы добраться до любого из этого совершенства:
CreateDomainSetup(IUnknown** pAppDomainSetup)
, это вернет тебяIAppDomainSetup
пример.- Заполните это соответствующим образом (я думаю, что все вещи политики доступны там)
- использование
CreateDomainEx
, передавая ваш инициализированный экземпляр установки в качестве второго параметра - Прибыль?
Рекомендации: