没人知道吗?不会都是手工设置的吧?!

解决方案 »

  1.   

    以NT Service为例,假设工程名称为MgrServer。在MgrServer.cpp加入如下代码:// 对Server进行初始化,设置其安全特性  Added by XXX 2001/10/23
    extern "C" BOOL WINAPI InitApplication()
    {
        HRESULT hResult = CoInitialize(NULL);
            if (FAILED(hResult))
                return FALSE;        // failed to initialize COM    // 这里设置权限为最低(允许任何人访问),其它的权限设置参见MSDN
        CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE,
            RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
       // 其它初始化代码
    ……
       // 初始化成功
         return TRUE;
    }然后在MgrServer.cpp中的Run()中作如下更改。
    void CServiceModule::Run()
    {
    _Module.dwThreadID = GetCurrentThreadId();  // 注释掉的为ATL自动生成的代码
    /*  HRESULT hr = CoInitialize(NULL);
    //  If you are running on NT 4.0 or higher you can use the following call
    //  instead to make the EXE free threaded.
    //  This means that calls come in on a random RPC thread
    //  HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);    _ASSERTE(SUCCEEDED(hr));    // This provides a NULL DACL which will allow access to everyone.
        CSecurityDescriptor sd;
        sd.InitializeFromThreadToken();
        hr = CoInitializeSecurity(sd, -1, NULL, NULL,
        RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); // 当然也可以直接在这里设置,而不必添加InitApplication(),但添加后结构更清晰
        _ASSERTE(SUCCEEDED(hr));    */
    /////////////////////////////////Added by XXX 2001/10/23
    HRESULT hr = S_OK;
    if (!InitApplication())
    return;
    /////////////////////////////////End adding
       ......
    }