• <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  評(píng)論-262  文章-1  trackbacks-0
            我們編寫(xiě)服務(wù)程序的時(shí)候可能會(huì)創(chuàng)建具名內(nèi)核對(duì)象如互斥量, 信號(hào)量, 事件, 文件映射, 等等, 然后, 這個(gè)有名字的內(nèi)核對(duì)象可能在某一個(gè)具體的用戶賬號(hào)內(nèi)運(yùn)行的程序被訪問(wèn)到, 甚至是受限的用戶帳戶內(nèi)運(yùn)行的程序. 這時(shí)就會(huì)出現(xiàn)創(chuàng)建不了該具名內(nèi)核對(duì)象的現(xiàn)象, 錯(cuò)誤碼為 "拒絕訪問(wèn)".

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

            代碼如下:

            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 群組建立一個(gè) SID 
                    SID_IDENTIFIER_AUTHORITY sidAuth = SECURITY_WORLD_SID_AUTHORITY;

                    
            if (NULL == pSDStuff) { 
                        
            break
                    }
                    
                    
            if (!AllocateAndInitializeSid( &sidAuth, 1, SECURITY_WORLD_RID,
                        
            0000000&pSDStuff->psidEveryone ))
                    { 
                        
            break
                    }
                    
                    
            // 我們建立兩個(gè)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(); 
            //錯(cuò)誤
                        break
                    }
                    
                    
            // 分配空間給安全描述項(xiàng)
                    pSDStuff->pSD = HeapAlloc(GetProcessHeap(), 0, SECURITY_DESCRIPTOR_MIN_LENGTH);
                    
            if (pSDStuff->pSD == NULL){
                        
            break
                    }
                    
            // 我們現(xiàn)在有一個(gè)空的安全描述項(xiàng)
                    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 
                { 
                    
            // 假如我們包括一個(gè)現(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) { 
                        
            // 逐步瀏覽每個(gè)SID 
                        while (nNumSids--) { 
                            
            // 假如SID無(wú)效, 那么就跳出 
                            if (!IsValidSid(ppSidArray[nNumSids])) { 
                                lACLSize 
            = 0
                                
            break
                            } 
                            
            // 取得 SID 的長(zhǎng)度 
                            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) { 
                        
            // 逐步瀏覽每個(gè)ACE 
                        while (nNumACEs--){ 
                            
            // 取得SIDs長(zhǎng)度 
                            lACLSize += ppACEs[nNumACEs]->aceHeader.AceSize; 
                        } 
                    } 
                    
            // 加入 ACL 結(jié)構(gòu)本身 
                    lACLSize += sizeof(ACL); 
                } 
            while (FALSE); 
                
                
            return (lACLSize); 
            }
            希望這段代碼能對(duì)被同樣問(wèn)題困擾的人有所幫助. 對(duì)它的使用極其簡(jiǎn)單:

                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 閱讀(1529) 評(píng)論(0)  編輯 收藏 引用

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


            91精品国产综合久久精品| 久久国产精品波多野结衣AV| 人妻少妇久久中文字幕| 久久亚洲国产精品一区二区| 日韩久久无码免费毛片软件 | 97r久久精品国产99国产精| 久久久91精品国产一区二区三区 | 亚洲成色999久久网站| 精品久久久无码人妻中文字幕| 97久久精品无码一区二区天美| 亚洲国产香蕉人人爽成AV片久久| 久久亚洲AV成人出白浆无码国产| 久久精品免费网站网| 久久精品国产精品青草| 久久久久国产精品人妻| 久久亚洲色一区二区三区| 久久狠狠色狠狠色综合| 久久综合九色综合网站| 国产精品久久久久a影院| 久久国产成人| 国产999精品久久久久久| 久久国产乱子伦精品免费强| 久久久久亚洲AV无码网站| 狠狠色婷婷久久综合频道日韩| 欧美粉嫩小泬久久久久久久 | 久久久久18| 欧美久久综合九色综合| 精品久久久无码中文字幕| 成人精品一区二区久久| 久久精品国产99国产精偷| 久久九九亚洲精品| 久久九色综合九色99伊人| 国产福利电影一区二区三区,免费久久久久久久精 | 国产午夜久久影院| 精品久久香蕉国产线看观看亚洲| 国产Av激情久久无码天堂| 国产精品一区二区久久不卡 | 青青青青久久精品国产h久久精品五福影院1421 | 久久九九亚洲精品| 精品久久综合1区2区3区激情| 久久久久久无码国产精品中文字幕 |