• <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   管理


            狠狠色丁香久久婷婷综合| 伊人久久大香线蕉综合Av| 成人精品一区二区久久久| 精品国产热久久久福利| 久久有码中文字幕| 99久久无色码中文字幕人妻| WWW婷婷AV久久久影片| 国产精品免费久久久久电影网| 久久午夜无码鲁丝片秋霞| 蜜臀久久99精品久久久久久小说| 国产亚洲精品自在久久| 久久久91人妻无码精品蜜桃HD| 久久久久久综合网天天| 色综合久久最新中文字幕| 久久精品国产免费观看三人同眠| 欧美综合天天夜夜久久| 免费无码国产欧美久久18| 国内精品久久人妻互换| 久久人人添人人爽添人人片牛牛| 91亚洲国产成人久久精品网址| 久久精品人妻中文系列| 日批日出水久久亚洲精品tv| 人妻精品久久无码专区精东影业 | 久久久精品国产sm调教网站 | 精品久久久久久无码专区不卡| 久久久久亚洲AV无码专区网站 | 久久精品国产亚洲一区二区| 香蕉久久夜色精品国产2020| 国产巨作麻豆欧美亚洲综合久久| 久久午夜伦鲁片免费无码| 无码任你躁久久久久久老妇App| 亚洲国产精品人久久| 精品久久久久久久无码| 亚洲AV无码久久精品蜜桃| 亚洲人成电影网站久久| 一级做a爰片久久毛片毛片| 国产精品欧美亚洲韩国日本久久| 一级做a爱片久久毛片| 国产国产成人久久精品| 久久国产福利免费| 久久久精品日本一区二区三区|