我用一桌面程序创建了一内存影射文件,该内存影射的安全上下文是EVERYONE,然后写了个ACTIVEX控件在IIS6中用ASP进行访问,服务器始终不能打开该内存影射,在调用OPENFILEMAPPING时出错,(注:在IIS5中运行正常),请教高手给予指点,谢谢!!!!1

解决方案 »

  1.   

    don't write ActiveX, write UI-less COM objects.
    how did you initialize your security descriptor? How did you modify the ACL?
      

  2.   

    我将代码写入DLL中,用VB建立COM调用此DLL,在WIN2000,WINXP,IIS5上运行正常,可用到WIN2003(IIS6)就不行了,即使将IIS6的服务隔离模式设置为IIS5的也不行,但是在桌面上调用此COM却可以,我估计是权限问题,但找了好久也没解决,请你帮我看看,谢谢
    int _stdcall BuildRestrictedSD(PSECURITY_DESCRIPTOR  pSd){
       DWORD  dwAclLength;   int iResult=0;
       PSID   psidEveryone = NULL;   PACL   pDACL   = NULL;
       BOOL   bResult = FALSE;   PACCESS_ALLOWED_ACE pACE = NULL;   SID_IDENTIFIER_AUTHORITY siaWorld = SECURITY_WORLD_SID_AUTHORITY  ;
       
       SECURITY_INFORMATION si = DACL_SECURITY_INFORMATION;
       
       __try {
          if (!InitializeSecurityDescriptor(pSd, 
                SECURITY_DESCRIPTOR_REVISION)) {
    iResult=1;
             __leave;
          }      if (!AllocateAndInitializeSid(&siaWorld, 1, 
                SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, 
                &psidEveryone)) {
    iResult=2;
              __leave;
          }       dwAclLength = sizeof(ACL)
                + sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD)
                + GetLengthSid(psidEveryone); 
          pDACL = (PACL) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 
                dwAclLength);
          if (!pDACL) {
      iResult=3;
             __leave;
          }      if (!InitializeAcl(pDACL, dwAclLength, ACL_REVISION)) {
      iResult=4;
             __leave;
          }
          
          if (!AddAccessAllowedAce(pDACL, ACL_REVISION,
                GENERIC_ALL,
                psidEveryone)) {
    iResult=5;
             __leave;
          }      if (!SetSecurityDescriptorDacl(pSd, TRUE, pDACL, FALSE)) {
      iResult=6;
             __leave;
          }      bResult = TRUE;
         
       } __finally {
          if (psidEveryone) FreeSid(psidEveryone);
       }
       if(bResult==FALSE){
    if (pDACL) HeapFree(GetProcessHeap(), 0, pDACL);
    pDACL = NULL;
       }
       ptr=(PVOID)pDACL;
       return iResult;
    }
    void _stdcall FreeRestrictedSD(){
    if(ptr) HeapFree(GetProcessHeap(), 0, ptr);
    }
    int _stdcall InitMap(){
       SECURITY_ATTRIBUTES sa;
       SECURITY_DESCRIPTOR sd;
       sa.nLength=sizeof(sa);
       sa.bInheritHandle=FALSE;
       sa.lpSecurityDescriptor=&sd;
       int iResult=BuildRestrictedSD(&sd);
       if(iResult==0){
       hFileMap=CreateFileMapping(INVALID_HANDLE_VALUE,&sa,PAGE_READWRITE,0,1024,"be9d6090-9842-41b2-90cd-9c8dcc1805c4"); 
       if(hFileMap==NULL) {
       iResult=7;
       }else{
              pFileView=MapViewOfFile(hFileMap,FILE_MAP_WRITE,0,0,0);
      if(pFileView==NULL){
      iResult=8;
      }
       }
       }
       return iResult;
    }
    void _stdcall FreeMap(){
    if(pFileView){
    UnmapViewOfFile(pFileView); 
    }
    if(hFileMap){
    CloseHandle(hFileMap) ;
    }
    FreeRestrictedSD();
    }
    void _stdcall WriteInfo(LPCTSTR pInfo){
    RtlMoveMemory(pFileView,pInfo,strlen(pInfo)); 
    }
      

  3.   

    如果安装了终端服务的话,CreateFileMapping时使用的名字前面要加global\\,不然其他session不能访问这个对象
    不过也不会出access denied错误啊,奇怪了
      

  4.   

    "Standard users do have the rights to create global named objects like events and mutexes. The only exception is global file mappings (i.e. global shared memory), which since 2003 can only be created by standard users if running in session 0 - which under Vista basically means never, since only services run in session 0 on Vista." http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=839720&SiteID=1
      

  5.   

    jiangsheng:
       请问你说的CreateFileMapping时使用的名字前面要加global\\ 是加在哪里啊~~是加在CreateFileMapping方法里面吗。。