2010-10-22 76 views
11

我希望執行IPC使用命名共享內存。系統錯誤0x5:CreateFileMapping()

爲此,其中一個步驟是得到一個句柄映射內存對象,使用的CreateFileMapping()。

我這樣做是完全一樣的MSDN網站reccommends:http://msdn.microsoft.com/en-us/library/aa366551(v=VS.85).aspx

hFileMappingHandle = CreateFileMapping 
    (
     INVALID_HANDLE_VALUE,  // use paging file 
     NULL,      // default security 
     PAGE_READWRITE,   // read/write access 
     0,   // maximum object size (high-order DWORD) 
     256,   // maximum object size (low-order DWORD) 
     "Global\\MyFileMappingObject"   // name of mapping object 
    ); 
DWORD dwError = GetLastError(); 

然而,返回的句柄總是爲0x0,並返回系統錯誤代碼是:爲0x5(拒絕訪問。 )

  • 只有命名記憶共享需要(不是文件共享)。
  • 的Windows 7 64位系統位操作系統
  • 管理員用戶可用權限
  • 開發的應用程序:64位插件應用文件(.dll)

是否有人有相同的經歷,和請解決它的一種方法?我使用MSDN網站作爲我的參考,所以我不認爲,代碼中存在問題。

+0

不確定這是什麼原因,但您是否需要將最大對象大小設置爲內存頁(4096字節)的倍數? – 2010-10-22 17:03:50

+1

嗨尤金,不是,問題是我不設置SeCreateGlobalPriviledge。 – 2010-10-22 17:26:57

回答

8

看起來你沒有足夠的權限。

從MSDN:

創建其他 不是零會話的會話在 全局命名空間文件映射對象需要 SeCreateGlobalPrivilege特權。有關 的更多信息,請參閱內核對象 命名空間。

...

創建全局命名空間的文件映射對象 的,通過使用 的CreateFileMapping,比從零會話以外的會話 是 特權操作。正因爲如此, 在任意 遠程桌面會話主機上運行(RD 會話主機)服務器會話的應用必須在 爲了成功地創建了全球命名空間的文件映射對象 啓用 SeCreateGlobalPrivilege。 特權檢查限於創建文件映射對象的 ,而 不適用於打開現有的 。例如,如果服務或 系統創建文件映射對象,則任何會話中運行的任何進程都可以 訪問該文件映射對象 ,前提是用戶必須具有訪問權限 。

+2

嗨尤金,那正是我的問題。我從我的映射對象的名稱中刪除了前綴「Global \\」,並且知道解決了這個問題。我不打算處理終端服務,所以現在解決方案應該是可以接受的。我閱讀SeCreateGlobalPriviledge上的文檔,但是我不清楚,如果特權可以由應用程序本身分配,或者我必須手動調整Windows資源管理器中的權限說明嗎? – 2010-10-22 17:23:50

+1

該特權由您的應用程序啓動的用戶帳戶定義。您可以嘗試按照此處所述使用AdjustTokenPrivilege函數:http://delphi.about.com/b/2008/09/26/zarko-needs-help-createfilemapping-terminal-services-global-session-secreateglobalprivilege.htm,但這並不能保證結果。一般來說,嘗試搜索SeCreateGlobalPrivilege,結果包含一些有趣的信息來源 – 2010-10-22 20:00:13

1

要創建全局文件映射,您需要SeCreateGlobalPrivilege特權 - 你有嗎?拒絕訪問意味着這是一個權限問題,當然。

+0

嗨史蒂夫,那是我的問題。謝謝。我現在以不同的方式解決了這個問題,但是如果我想要設置特權,可以在我的應用程序中以編程方式完成嗎? – 2010-10-22 17:25:03

+0

您可以使用'AdjustTokenPrivileges'來執行此操作,如下所示:http://msdn.microsoft.com/en-us/library/aa446619(v=VS.85).aspx。令牌句柄來自'OpenProcessToken',必須使用(至少)'TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY' – 2010-10-22 17:35:19

+0

非常感謝。 – 2010-10-22 17:42:34

2

默認情況下,管理員,服務和網絡服務具有SeCreateGlobalPrivilege。你必須記住,Windows7/Vista並不像管理員那樣運行所有的東西。因此,請使用「以管理員身份啓動」使「全局」適用於您的應用程序。如果您正在調試,也可以以管理員身份啓動Visual Studio。

+0

非常感謝!默認情況下,Windows 10下的Visual Studio不是管理員。那是我的問題。 – 2016-07-12 15:55:06

0

有關全局名稱空間的文檔中對終端服務的引用有點誤導,因爲這意味着如果您遇到異常情況,您只需要擔心這一點。

事實上,IIS和系統服務都在會話零中運行,並且第一個/唯一登錄的用戶在會話1中運行 - 因此必須使用全局名稱空間在IIS或服務與普通程序之間進行通信。