ActiveX标准用户支持

时间:2014-09-12 14:52:07

标签: c++ com activex

通过将HKLM和HKCR的注册表项重定向到HKCU,我将每台机器的ActiveX转换为每用户ActiveX。现在我甚至可以从标准用户安装我的activeX。现在我想将我的ActiveX控件标记为初始化和脚本安全。我试过了this。但是我被抛出了#34; Access Denied"从非本地管理员的任何用户标记控件安全的脚本时出错。我发现我的dllRegisterServer方法在HKCR中创建了一些注册表项,以便将我的ocx标记为脚本和初始化的安全。所以我通过以下方法进行了以下从HKLM到HKCU的重定向。

HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
{
HKEY key;
if ( aboveXP )
{
    if ( ERROR_SUCCESS != ::RegOpenKeyW(HKEY_CURRENT_USER, L"Software\\Classes", &key) )
    {
        return E_FAIL;
    }
    if ( ERROR_SUCCESS != ::RegOverridePredefKey(HKEY_CLASSES_ROOT, key) )
    {
        ::RegCloseKey(key);
        return E_FAIL;
    }       
}

// Register your component categories information.
ICatRegister* pcr = NULL ;
HRESULT hr = S_OK ;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
    NULL,
    CLSCTX_INPROC_SERVER,
    IID_ICatRegister,
    (void**)&pcr);
if (SUCCEEDED(hr))
{
    // Register this category as being "implemented" by
    // the class.
    CATID rgcatid[1] ;
    rgcatid[0] = catid;
    hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);

    if(FAILED(hr))
    {
        sprintf ( log , "RegisterClassImplCategories failed with error %lu" , hr ) ;
        MessageBox ( NULL , log , _T("ClassImplCategories Failed" ) , MB_OK ) ;
    }

}
else
{
    sprintf ( log , "CO-CREATE-INSTANCE failed with error %lu" , hr ) ;
    MessageBox ( NULL , log , _T("CoCreateInstance Failed" ) , MB_OK ) ;

    _com_error err(hr);
    LPCTSTR errMsg = err.ErrorMessage();
    MessageBox ( NULL , errMsg , _T("CO-CREATE-INSTANCE failed - Error Message") , MB_OK ) ;
}


if (pcr != NULL)
    pcr->Release();

if ( aboveXP )
{
    ::RegCloseKey ( key ) ;
}
MessageBox ( NULL , "RETUNING FROM SAFE FOR SCRIPTING" , "TEST" , MB_OK ) ;
return hr;}

现在我的"访问被拒绝"问题解决了,但是当我安装这个新的每用户版本时,系统会提示我重启。我怀疑我是否将一个必须在HKLM的注册表项重定向到HKCU。

以下条目在HKCR中作出,同时将OCX控件标记为可安全编写脚本。

HKEY_CLASSES_ROOT \元器件    类别{7DD95801-9882-11CF-9FA9-00AA006C42C4}

HKEY_CLASSES_ROOT \元器件    类别{7DD95802-9882-11CF-9FA9-00AA006C42C4}

HKEY_CLASSES_ROOT \ CLSID {"您的控件GUID"} \已实施    类别{7DD95801-9882-11CF-9FA9-00AA006C42C4}

HKEY_CLASSES_ROOT \ CLSID {"您的控件GUID"} \已实施    类别{7DD95802-9882-11CF-9FA9-00AA006C42C4}

即使没有重定向,我也没有问题创建前两个条目。但是当我的控件试图从非本地管理员帐户创建最后两个时,我被拒绝访问。同时,即使我从标准用户帐户注册我的ocx,我也能找到前两个条目。

在标记我的ocx安全脚本时,后端发生了什么? 为什么我提示重启,我该如何避免? 我究竟做错了什么 ? 如何标记我的每用户activeX控件对脚本安全?

我提到了this

感谢任何帮助。

0 个答案:

没有答案