docker容器内Win32 api的绑定目录
背景: 我目前正在开发一个windows服务,用于监视windows计算机上文件系统的更改 下一步是将此应用程序放入容器中,以便在每台机器上运行。为了“捕获”目录更改,我在C++中使用了函数<强> RerecDirectYyExeXWW <强>。对给定目录的任何更改都将引发windows事件 为了启动容器并测试服务,我使用以下命令:docker容器内Win32 api的绑定目录,docker,winapi,windows-services,containers,c++17,Docker,Winapi,Windows Services,Containers,C++17,背景: 我目前正在开发一个windows服务,用于监视windows计算机上文件系统的更改 下一步是将此应用程序放入容器中,以便在每台机器上运行。为了“捕获”目录更改,我在C++中使用了函数 RerecDirectYyExeXWW 。对给定目录的任何更改都将引发windows事件 为了启动容器并测试服务,我使用以下命令: docker run --rm -it --workdir="c:\FileAgent" monitor 其中,FileAgent是我放置.exe的目录,monitor是我图
docker run --rm -it --workdir="c:\FileAgent" monitor
其中,FileAgent是我放置.exe
的目录,monitor是我图像的名称
通过运行该服务来监视容器的本地目录,该服务可以正常工作。但是,当我试图通过绑定监视主机上的文件夹时,该服务的工作状态不是ReadDirectoryChangesSW为FALSE,应用程序正在崩溃
代码示例:
string lpDir = "C:/tmp/";
FILE_NOTIFY_EXTENDED_INFORMATION strFileNotifyInfo[1024];
HANDLE fileH = CreateFileA
(
lpDir.c_str(),
FILE_LIST_DIRECTORY,
FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
NULL
);
if (!fileH) ErrorReporter(L"Error in creating file handler");
OVERLAPPED ovl = { 0 };
ovl.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!ovl.hEvent) {
ErrorReporter(L"ERROR in creating event.");
ExitProcess(GetLastError());
}
if (!ReadDirectoryChangesExW(
fileH, (LPVOID)&strFileNotifyInfo, sizeof(strFileNotifyInfo),
TRUE, //subtree watcher
FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_ATTRIBUTES,
NULL, &ovl, NULL, ReadDirectoryNotifyExtendedInformation))
{
ErrorReporter(L"Error in reading directory changes!");
ExitProcess(GetLastError());
}
其中lpDir是目录的路径。要重新生成该状态,在构建docker映像后,我使用以下命令启动容器:
docker run --rm -it --workdir="c:\FileAgent" -v c:\Users\john\Desktop\dataDir:c:\tmp\ monitor
正如我测试的,这是一个双向绑定。这意味着对dataDir的更改会影响容器内的tmp目录,反之亦然。当我启动服务时,它会像我之前提到的那样崩溃
我尝试的是:
--user“NT AUTHORITY\SYSTEM”
启动具有特定用户的容器RUN NET USER my_admin /add
RUN NET LOCALGROUP Administrators /add
my_admin USER my_admin
…
。此外,我无法删除此文件夹,因为真正的文件夹位于主机上
你能提供一些建议吗
我是否缺少任何安全/访问权限问题?“ReadDirectoryChangesSW为空”-这是什么意思?当然,符号已正确导入(即,它具有非空地址)。否则应用程序甚至无法启动。A是必需的。编辑了我的问题并提供了一些代码。谢谢
ReadDirectoryChangesCW
为FALSE-在此之后返回了什么RtlGetLastNtStatus()
?您调用GetLastError
太晚了。请参阅“打开”按钮,以确定何时调用它。此外,Windows上的路径分隔符是反斜杠,而不是正斜杠。如果您想避免遇到无法解决的问题,请调用CreateFileW
,而不是CreateFileA
。无论如何,返回失败代码的API调用不会导致应用程序崩溃。@kothemel-如果(!fileH)
检查错误CreateFileA
返回错误无效句柄\u值
(-1),但不是0。因此,您不会在此处捕获fail并将无效句柄传递给ReadDirectoryChangesSW
,并获得状态\u无效句柄