• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-60  評論-262  文章-1  trackbacks-0
            我們編寫服務(wù)程序的時候可能會創(chuàng)建具名內(nèi)核對象如互斥量, 信號量, 事件, 文件映射, 等等, 然后, 這個有名字的內(nèi)核對象可能在某一個具體的用戶賬號內(nèi)運行的程序被訪問到, 甚至是受限的用戶帳戶內(nèi)運行的程序. 這時就會出現(xiàn)創(chuàng)建不了該具名內(nèi)核對象的現(xiàn)象, 錯誤碼為 "拒絕訪問".

            經(jīng)過反復(fù)查閱資料, 我給出一個解決方案, 就是在創(chuàng)建內(nèi)核對象之前, 先創(chuàng)建一個屬于 everyone 群組的權(quán)限為完全控制的安全描述符, 然后將這個安全描述符作為創(chuàng)建內(nèi)核對象的函數(shù)的必須的參數(shù)傳入. 這樣, 整個正在運行的操作系統(tǒng)的任何進程都能訪問這個內(nèi)核對象了.

            代碼如下:

            typedef struct SDSTUFF
            {
                PSID psidEveryone;
                PACL pDACL;
                PSECURITY_DESCRIPTOR pSD;
            } SDSTUFF;

            typedef union _ACE_UNION{ 
                ACE_HEADER aceHeader; 
                ACCESS_ALLOWED_ACE aceAllowed; 
                ACCESS_DENIED_ACE aceDenied; 
                SYSTEM_AUDIT_ACE aceAudit; 
            * PACE_UNION; 

            ULONG CalculateACLSize(PACL pACLOld, PSID
            * ppSidArray, int nNumSids, PACE_UNION * ppACEs, int nNumACEs); 

            EXTERN_C BOOL CreateEveryoneSD(OUT SDSTUFF 
            * pSDStuff) 
            {
                BOOL bResult 
            = FALSE; 
                PSID psidArray[
            2= { 0 };
                ULONG lACLSize 
            = 0
                
                
            do 
                {
                    
            // 為內(nèi)建的 Everyone 群組建立一個 SID 
                    SID_IDENTIFIER_AUTHORITY sidAuth = SECURITY_WORLD_SID_AUTHORITY;

                    
            if (NULL == pSDStuff) { 
                        
            break
                    }
                    
                    
            if (!AllocateAndInitializeSid( &sidAuth, 1, SECURITY_WORLD_RID,
                        
            0000000&pSDStuff->psidEveryone ))
                    { 
                        
            break
                    }
                    
                    
            // 我們建立兩個ACEs,兩者都使用 Everyone 群組
                    psidArray[0= pSDStuff->psidEveryone;
                    psidArray[
            1= pSDStuff->psidEveryone;
                    
                    
            // 取得新ACL的大小
                    lACLSize = CalculateACLSize(NULL, psidArray, 2, NULL, 0);
                    
            if (0 == lACLSize){
                        
            break
                    }
                    
                    
            // 分配內(nèi)存給ACL
                    pSDStuff->pDACL = (PACL)HeapAlloc(GetProcessHeap(), 0, lACLSize);
                    
            if (pSDStuff->pDACL == NULL){
                        
            break
                    }
                    
                    
            // 初始化ACL
                    if (!InitializeAcl(pSDStuff->pDACL, lACLSize, ACL_REVISION)){
                        
            break
                    }
                    
                   // 加入允許的ACE
                    if (!AddAccessAllowedAce(pSDStuff->pDACL, ACL_REVISION, 
                        STANDARD_RIGHTS_ALL
            |SPECIFIC_RIGHTS_ALL, psidArray[1])) 
                    {
                        GetLastError(); 
            //錯誤
                        break
                    }
                    
                    
            // 分配空間給安全描述項
                    pSDStuff->pSD = HeapAlloc(GetProcessHeap(), 0, SECURITY_DESCRIPTOR_MIN_LENGTH);
                    
            if (pSDStuff->pSD == NULL){
                        
            break
                    }
                    
            // 我們現(xiàn)在有一個空的安全描述項
                    if (!InitializeSecurityDescriptor(pSDStuff->pSD, SECURITY_DESCRIPTOR_REVISION)) {
                        
            break
                    }
                    
            // 我們的 DACL
                    if (!SetSecurityDescriptorDacl(pSDStuff->pSD, TRUE, pSDStuff->pDACL, FALSE)) {
                        
            break
                    }
                    bResult 
            = TRUE; 
                } 
            while(FALSE); 
                
            return bResult; 
            }

            EXTERN_C BOOL ClearupEveryoneSD(IN SDSTUFF stSDStuff) 
            {
                
            // 清除
                HeapFree(GetProcessHeap(), 0, stSDStuff.pSD);
                HeapFree(GetProcessHeap(), 
            0, stSDStuff.pDACL);
                FreeSid(stSDStuff.psidEveryone); 
                
            return TRUE; 
            }


            ULONG CalculateACLSize(PACL pACLOld, PSID
            * ppSidArray, int nNumSids, PACE_UNION* ppACEs, int nNumACEs)

                ULONG lACLSize 
            = 0
                
                
            do 
                { 
                    
            // 假如我們包括一個現(xiàn)存的 ACL, 那么找出它的大小 
                    if (pACLOld != NULL){ 
                        ACL_SIZE_INFORMATION aclSize 
            = { 0 }; 
                        
            if(!GetAclInformation(pACLOld, &aclSize, sizeof(aclSize), AclSizeInformation)){ 
                            
            break
                        } 
                        lACLSize 
            = aclSize.AclBytesInUse; 
                    } 
                    
            if (ppSidArray != NULL) { 
                        
            // 逐步瀏覽每個SID 
                        while (nNumSids--) { 
                            
            // 假如SID無效, 那么就跳出 
                            if (!IsValidSid(ppSidArray[nNumSids])) { 
                                lACLSize 
            = 0
                                
            break
                            } 
                            
            // 取得 SID 的長度 
                            lACLSize += GetLengthSid(ppSidArray[nNumSids]); 
                            
            // 加入ACE 結(jié)構(gòu)大小, 減去 SidStart 成員的大小 
                            lACLSize += sizeof(ACCESS_ALLOWED_ACE) - sizeof(((ACCESS_ALLOWED_ACE*)0)->SidStart); 
                        } 
                        
            if(0 == lACLSize) { break; } 
                    } 
                    
            if (ppACEs != NULL) { 
                        
            // 逐步瀏覽每個ACE 
                        while (nNumACEs--){ 
                            
            // 取得SIDs長度 
                            lACLSize += ppACEs[nNumACEs]->aceHeader.AceSize; 
                        } 
                    } 
                    
            // 加入 ACL 結(jié)構(gòu)本身 
                    lACLSize += sizeof(ACL); 
                } 
            while (FALSE); 
                
                
            return (lACLSize); 
            }
            希望這段代碼能對被同樣問題困擾的人有所幫助. 對它的使用極其簡單:

                SECURITY_ATTRIBUTES sa = {0};
                SDSTUFF stSDStuff = { 0 };

                CreateEveryoneSD(
            &stSDStuff); 
                sa.nLength 
            = sizeof(sa);
                sa.lpSecurityDescriptor 
            = stSDStuff.pSD;
                
                g_hMap = CreateFileMapping(INVALID_HANDLE_VALUE,  // Current file handle. 
                    &sa,      // Default security. 
                    PAGE_READWRITE,                     // Read/write permission. 
                    0,                                  // Max. object size. 
                    ulCodeLen,                          // Size of hFile. 
                    "xxxxxxxxxxxxxxxxxxxxxxx");         // Name of mapping object. 

                ClearupEveryoneSD(stSDStuff); 


            posted on 2008-07-30 09:23 free2000fly 閱讀(1518) 評論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            www.久久热.com| 久久精品国产亚洲AV高清热| 久久99精品国产一区二区三区| 日韩久久久久久中文人妻| 久久久久亚洲AV无码专区体验| 欧洲人妻丰满av无码久久不卡| 狠色狠色狠狠色综合久久| 99久久777色| 久久久精品波多野结衣| 亚洲性久久久影院| 久久精品综合网| 日韩久久久久久中文人妻 | 久久天天躁狠狠躁夜夜av浪潮 | 久久精品国产男包| 伊人久久精品无码二区麻豆| 乱亲女H秽乱长久久久| 人妻系列无码专区久久五月天| 久久人人爽爽爽人久久久| 久久亚洲高清观看| 精品国产乱码久久久久久人妻| 久久996热精品xxxx| 伊人久久国产免费观看视频| 久久久91精品国产一区二区三区 | 四虎国产精品免费久久5151 | 久久精品国产亚洲77777| 成人久久久观看免费毛片| 久久天堂AV综合合色蜜桃网| 国产99久久九九精品无码| 亚洲国产精品无码久久一线| 99久久无码一区人妻a黑| 久久被窝电影亚洲爽爽爽| 久久综合色老色| 国产精品va久久久久久久| 2021少妇久久久久久久久久| 国产成人精品综合久久久 | 久久精品国产一区二区| 久久综合九色综合97_久久久| 久久天天躁狠狠躁夜夜avapp| 久久综合精品国产二区无码| 亚洲精品无码久久毛片| 久久久久国产精品嫩草影院|