使用CreateFile打开目录
我正在尝试使用CreateFile函数来访问目录信息。 我收到的win32错误代码为5,这意味着拒绝访问。 请指教。
CreateFile(path, GENERIC_READ, FILE_SHARE_READ, IntPtr.Zero, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, IntPtr.Zero);
这是正在进行的调用,并且如文档中所述,正在使用’FILE_FLAG_BACKUP_SEMANTICS’。 DLL导入似乎工作正常,如下所示:
[DllImport("kernel32.dll", SetLastError = true)] public static extern IntPtr CreateFile(string filename, uint desiredAccess, uint sharedMode, IntPtr securityAttributes, uint creationDisposition, uint flagsAndAttributes, IntPtr templateFile);
更新:我需要获取目录的句柄,以便我可以使用GetFileInformationByHandle()并提取唯一ID。 此方法目前适用于文件,目前无法使用目录。
更新:此问题的X是我需要一个目录的唯一标识符,该标识符不是其绝对路径。 即使移动或重命名目录,它也需要保持不变。 .NET没有提供刚刚提到的任何唯一标识符,只能通过使用win32来完成
首先,您应该在应用程序中包含清单,以确保它在管理员权限下运行。 然后,您应该使用AdjustTokenPrivileges
API启用SE_BACKUP_NAME
权限。 然后我建议你使用FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE
FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE
FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE
标记为FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE
。 现在,您应该能够使用CreateFile
打开目录句柄并使用GetFileInformationByHandle
来获取BY_HANDLE_FILE_INFORMATION
。
更新 :可能以下简单的演示程序可以帮助您
#include #include int _tmain() { HANDLE hAccessToken = NULL; HANDLE hFile = INVALID_HANDLE_VALUE; __try { LUID luidPrivilege; DWORD dwErrorCode; BY_HANDLE_FILE_INFORMATION fiFileInfo; // ----------------------------------------------------- // first of all we need anable SE_BACKUP_NAME privilege // ----------------------------------------------------- if (!OpenProcessToken (GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hAccessToken)) __leave; if (LookupPrivilegeValue (NULL, SE_BACKUP_NAME, &luidPrivilege)) { TOKEN_PRIVILEGES tpPrivileges; tpPrivileges.PrivilegeCount = 1; tpPrivileges.Privileges[0].Luid = luidPrivilege; tpPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges (hAccessToken, FALSE, &tpPrivileges, 0, NULL, NULL); if ((dwErrorCode = GetLastError ()) != ERROR_SUCCESS) __leave; } else __leave; // ----------------------------------------------------- // now one can open directory and get // ----------------------------------------------------- hFile = CreateFile (TEXT("C:\"), 0, //GENERIC_READ, 0, //FILE_SHARE_READ, //FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (hFile == INVALID_HANDLE_VALUE) __leave; if (!GetFileInformationByHandle (hFile, &fiFileInfo)) __leave; _tprintf(TEXT("VolumeSerialNumber: 0x%08Xn"), fiFileInfo.dwVolumeSerialNumber); _tprintf(TEXT("FileIndex: 0x%08X%08Xn"), fiFileInfo.nFileIndexHigh, fiFileInfo.nFileIndexLow); } __finally { if (hFile != INVALID_HANDLE_VALUE) CloseHandle (hFile); if (hAccessToken != NULL) CloseHandle (hAccessToken); } return 0; }
该程序打开C:
目录并显示标识NTFS上目录的卷序列号和文件索引。 为了缩短程序,我删除了所有错误消息(请参阅__leave
语句)。 就像我之前提到的那样,你应该使用requireAdministrator
作为“UAC执行级别”(参见链接器设置的“清单文件”部分)。 以上代码经过测试,对我有用。 您可以在C#中重现相同的代码。
上述就是C#学习教程:使用CreateFile打开目录分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/942607.html