SMB 访问绕过文件共享违规
SMB access bypasses file sharing violation
我有一台 Windows CE 5.0 机器,带有文件 \hard disk2\logs\myfile.err
.
的 smb 共享
此文件由批处理脚本创建,该脚本将另一个 exe 的 stderr 重定向到该文件:myapp.exe 2> "\hard disk2\logs\myfile.err"
.
考虑到我无法在 Windows CE 机器上用 NotepadCE
打开 myfile.err
而 myapp.exe
是 运行,这工作得非常好。如果我尝试 NotepadCE 显示共享冲突错误。
同一文件可以通过其 smb 共享同时读取,没有任何问题。
有没有办法让 Windows CE 机器上的其他程序在不停止 myapp.exe
的情况下读取这个文件?
为什么smb可以读,其他方式读不出来?
作为解决方法,我设法将文件复制到另一个位置,然后从那里读取它。
Why is it possible to read it via smb, but impossible to read it in another way?
我想这与传递给 CreateFile
的选项有关。
例如,用
打开一个文件
CreateFile(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, ...)
请求读取权限,同时允许其他人读取和写入。这可能是 SMB 服务所做的。
而打开为
CreateFile(path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, ...)
请求read/write访问权限,同时阻止其他人写入。批处理脚本可能会执行此操作。
最后 NotepadCE 可能会尝试使用
打开文件
CreateFile(path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, ...)
这将失败,因为它正在请求写访问,批处理解释器通过在 CreateFile
调用中仅传递 FILE_SHARE_READ
拒绝了。
当然,在没有访问源代码的情况下,这一切都是猜测,但如果您能够像上面第一个示例所示那样在本地打开文件,那么这就支持了理论。
More about CreateFile in the Docs.
Is there a way to enable other programs on the Windows CE machine to read this file without stopping myapp.exe?
有点,是的。而不是重定向 stderr 只是让 myapp.exe 将其输出直接写入 myfile.err,在创建文件时在 CreateFile
调用中传递 FILE_SHARE_READ | FILE_SHARE_WRITE
。这将允许其他请求写入权限的程序打开 myfile.err.
我有一台 Windows CE 5.0 机器,带有文件 \hard disk2\logs\myfile.err
.
的 smb 共享
此文件由批处理脚本创建,该脚本将另一个 exe 的 stderr 重定向到该文件:myapp.exe 2> "\hard disk2\logs\myfile.err"
.
考虑到我无法在 Windows CE 机器上用 NotepadCE
打开 myfile.err
而 myapp.exe
是 运行,这工作得非常好。如果我尝试 NotepadCE 显示共享冲突错误。
同一文件可以通过其 smb 共享同时读取,没有任何问题。
有没有办法让 Windows CE 机器上的其他程序在不停止 myapp.exe
的情况下读取这个文件?
为什么smb可以读,其他方式读不出来?
作为解决方法,我设法将文件复制到另一个位置,然后从那里读取它。
Why is it possible to read it via smb, but impossible to read it in another way?
我想这与传递给 CreateFile
的选项有关。
例如,用
打开一个文件CreateFile(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, ...)
请求读取权限,同时允许其他人读取和写入。这可能是 SMB 服务所做的。
而打开为
CreateFile(path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, ...)
请求read/write访问权限,同时阻止其他人写入。批处理脚本可能会执行此操作。
最后 NotepadCE 可能会尝试使用
打开文件CreateFile(path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, ...)
这将失败,因为它正在请求写访问,批处理解释器通过在 CreateFile
调用中仅传递 FILE_SHARE_READ
拒绝了。
当然,在没有访问源代码的情况下,这一切都是猜测,但如果您能够像上面第一个示例所示那样在本地打开文件,那么这就支持了理论。
More about CreateFile in the Docs.
Is there a way to enable other programs on the Windows CE machine to read this file without stopping myapp.exe?
有点,是的。而不是重定向 stderr 只是让 myapp.exe 将其输出直接写入 myfile.err,在创建文件时在 CreateFile
调用中传递 FILE_SHARE_READ | FILE_SHARE_WRITE
。这将允许其他请求写入权限的程序打开 myfile.err.