【问题标题】:C#0 net use connectionC#0 网络使用连接
【发布时间】:2015-05-23 22:56:04
【问题描述】:

所以我在 C# 中遇到了“net use”命令的问题。基本上,我使用的是here 编写的代码。该代码效果很好,但是我有多个需要按顺序使用的 id。不幸的是,当尝试连接到另一个 ID 时,连接在 Windows 中仍然处于“net use”状态,所以抛出了这个异常:

Win32Exception: Multiple connections to a server or shared resource by the same user, using more than one user name, are not allowed.

现在对我来说,显而易见的事情是以编程方式执行命令提示符,以在我完成使用连接时删除连接。这是我正在运行以删除连接的代码:

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/K net use delete \\IPAddrofserver";
process.StartInfo = startInfo;
process.Start();

我只使用 /k,所以我可以查看该命令是否有效。执行此代码后,它显示“找不到网络连接”。但是,如果我手动打开开始菜单并键入 net use,我可以看到并删除连接。我认为这可能与以下事实有关:以编程方式运行命令提示符时,我注意到它被赋予了管理权限,而不是在我的用户令牌下运行它,但我不能确定。对此的任何帮助将不胜感激。

编辑:在 WnetCancelConnection2 期间添加命令提示符删除代码实际上可以正常运行,并从网络使用中删除连接。但是,在程序外部手动检查网络使用情况会发现连接历史仍然存在并且处于打开状态。 Whoami 命令显示相同的用户。为什么以编程方式发生的事情与我手动检查时发生的事情之间存在差异?

【问题讨论】:

    标签: c# windows command prompt


    【解决方案1】:

    您可能需要以提升的权限启动您的进程。请参阅accepted answer here 了解如何执行此操作。您也可以选择直接调用relevant Windows API,以避免产生其他进程并处理这些并发症。

    【讨论】:

    • 奇怪的是,我认为我实际上可能需要减少权限。以用户身份登录并运行net use,我可以看到需要删除的连接。此过程仅作为 cmd.exe 运行。但是使用上面的代码,它以 cmd.exe(管理员)运行,无法查看连接。这不是意味着 cmd 提示符已经作为管理进程运行了吗?
    • 两件事: 1. 以管理员身份运行与以提升的权限运行不同。以提升的权限运行需要 UAC 确认(或代码签名,如链接答案中所述),并允许用户行使他们拥有的管理权限。 2. 您的父进程和子进程是否作为两个不同的用户运行?如果是这样,我并不奇怪他们看不到彼此的网络连接令牌。
    • 1.在给我的解决方案的约束下,UAC 提升将无法实现 2. 父进程和子进程是同一个用户。我通过在每个 cmd 窗口中使用“whoami”命令进行检查,返回相同的答案。对我来说,程序可以启动连接,但不能删除它似乎很奇怪。没有更自然的方法来解决这个问题吗?
    • 不使用“net use”并从您的服务直接访问 API 怎么样:msdn.microsoft.com/en-us/library/windows/desktop/…
    • 所以这很有意义,我注意到它实际上包含在原始库中。顺便说一句,到目前为止,我感谢所有帮助: private const int CONNECT_UPDATE_PROFILE = 0x00000001;他的一次性用品是 public void Dispose() { this.DisconnectFromShare(this._remoteUncName); } 调用 private void DisconnectFromShare(string remoteUnc) { int result = WNetCancelConnection2(remoteUnc, CONNECT_UPDATE_PROFILE, false); if (result != NO_ERROR) { throw new Win32Exception(result); } }
    猜你喜欢
    • 1970-01-01
    • 2011-06-01
    • 2022-12-21
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2018-04-18
    • 2018-08-24
    相关资源
    最近更新 更多