C# WMI 在远程 PC 上运行一个 exe,然后在同一台 PC 上运行另一个 exe,然后在网络路径上调用 Directory.CreateDirectory 并失败
Posted
技术标签:
【中文标题】C# WMI 在远程 PC 上运行一个 exe,然后在同一台 PC 上运行另一个 exe,然后在网络路径上调用 Directory.CreateDirectory 并失败【英文标题】:C# WMI runs an exe on a remote PC that then runs another exe on the same PC that then calls Directory.CreateDirectory on a network path and fails 【发布时间】:2010-02-18 20:22:16 【问题描述】:使用 C# WMI 我在另一台计算机上启动一个 exe,这个 exe 使用 C#Process
类启动另一个 exe。最后一个 exe 尝试使用网络路径(又名\\\\comp1\d$\dir\
)调用Directory.CreateDirectory
。 Directory.CreateDirectory
抛出这个异常:
Access to the path '\\\\blah\blah\blah' is denied. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.InternalCreateDirectory(String fullPath, String path, DirectorySecurity dirSecurity)
at System.IO.Directory.CreateDirectory(String path, DirectorySecurity directorySecurity)
如果我直接在计算机上的控制台中运行第三个 exe,则不会抛出此异常,并且一切正常。
正在创建目录的文件夹的安全设置具有“所有人”的完全权限。
我该如何解决这个问题?
【问题讨论】:
您确定共享网络文件夹的安全设置允许您读取/写入权限吗? 你看到下面@Nick 的回答了吗?我对 WMI 的研究告诉我他有正确的答案。如果您同意,您可能想要选择它。 :) 【参考方案1】:另外请注意,通过 WMI 启动应用程序时,还有第三层权限。例如,如果您在现有 WMI 对象上调用方法,它可能不会委托调用者权限,甚至不会委托主机 exe 的权限,但会有一个空主体。这可能发生在您身上。
转到计算机管理,然后在服务和应用程序下,右键单击 WMI 控制节点并选择属性。转到“安全”选项卡,然后导航到正确的 WMI 命名空间(很可能是 root\CIMV2),并确保您使用的用户在那里也具有适当的权限。
【讨论】:
如果我将每个人都添加到 root\CIMV2 并授予它完全权限,那会成功吗? 可能。我不确定这里发生了什么。我只是想让您知道,当您执行通过 WMI 启动的操作时,您实际上需要处理第三组权限。 好的,谢谢提醒。这肯定是一个痛苦的情况。 Nick 是正确的:WMI 不会固有地将凭据发送到在远程主机上启动的进程。这样做需要正确的“以其他用户身份登录”,这太危险了。不过,还有另一种方法,由 Frank White 创建。我参考了他并在这里创建了一个完整的脚本:***.com/a/11948096/1569434.【参考方案2】:正如 Aaron 所说,windows share 安全性有两个组成部分,首先是 Share 本身的安全性。第二个是该共享中文件和文件夹的安全性。
两者都必须允许创建目录访问才能使其工作。
您还应该知道,EVERYONE 组包括域计算机帐户、内置系统帐户、域用户、来宾和经过身份验证的用户。
这意味着您要做的第一件事是查看它实际在哪个用户下运行。如果它在计算机帐户下运行并且它不是域的一部分,那么您需要授予该计算机帐户访问共享和文件系统的权限。
【讨论】:
【参考方案3】:有关权限的一些建议,请参阅此线程。
http://www.eggheadcafe.com/community/aspnet/2/10058550/how-to-create-a-folder-in.aspx
【讨论】:
以上是关于C# WMI 在远程 PC 上运行一个 exe,然后在同一台 PC 上运行另一个 exe,然后在网络路径上调用 Directory.CreateDirectory 并失败的主要内容,如果未能解决你的问题,请参考以下文章