1

我创建了一个使用 WCF wsdualhttpbinding 回调功能的 Windows 服务(服务器)和一个 WPF(客户端)。两个软件之间的一切都正常工作,但我遇到的问题是客户端需要提升到管理员权限才能工作(这是可以理解的,因为它必须打开端口才能与服务器通信)

有什么方法可以将客户端配置为无需提升即可工作?或者也许创建一个一次性的永久连接,以便客户端不需要一直被提升?

我的想法和谷歌搜索词用完了..

更新

我找到了解决方案。如果我可以遵循另一个最佳实践,请纠正我!

我向运行 netsh 的客户端应用程序添加了“启用”和“禁用”按钮,以打开(或关闭)和保留端口。

使能够

Process process = new Process();
process.StartInfo = new ProcessStartInfo("netsh", @"http add urlacl url=http://+:" + PortNumber + @"/ user=DOMAIN\username");
process.StartInfo.Verb = "runas";
process.Start();
process.WaitForExit();

禁用

Process process = new Process();
process.StartInfo = new ProcessStartInfo("netsh", "http delete urlacl url=http://+:" + PortNumber + "/");
process.StartInfo.Verb = "runas";
process.Start();
process.WaitForExit();
4

2 回答 2

1

我找到了解决方案。如果我可以遵循另一个最佳实践,请纠正我!

我在运行 netsh 的客户端应用程序中添加了“启用”和“禁用”按钮,以打开(或关闭)和保留端口。

使能够

Process process = new Process();
process.StartInfo = new ProcessStartInfo("netsh", @"http add urlacl url=http://+:" + PortNumber + @"/ user=DOMAIN\username");
process.StartInfo.Verb = "runas";
process.Start();
process.WaitForExit();

禁用

Process process = new Process();
process.StartInfo = new ProcessStartInfo("netsh", "http delete urlacl url=http://+:" + PortNumber + "/");
process.StartInfo.Verb = "runas";
process.Start();
process.WaitForExit();
于 2014-02-15T04:12:20.557 回答
0

不幸的是,您只能在以管理权限运行时在 Windows 上打开一个端口。

http://msdn.microsoft.com/en-us/library/ms740548%28v=VS.85%29.aspx

要使用 SOCK_RAW 类型的套接字需要管理权限。运行使用原始套接字的 Winsock 应用程序的用户必须是本地计算机上管理员组的成员,否则原始套接字调用将失败并返回错误代码 WSAEACCES。在 Windows Vista 和更高版本上,对原始套接字的访问是在创建套接字时强制执行的。在早期版本的 Windows 中,对原始套接字的访问是在其他套接字操作期间强制执行的。

原始套接字提供了操纵底层传输的能力,因此它们可用于构成安全威胁的恶意目的。因此,只有管理员组的成员才能在 Windows 2000 及更高版本上创建 SOCK_RAW 类型的套接字。

编辑:如果您以管理员身份访问机器,则可以使用 netsh http://technet.microsoft.com/en-us/library/cc725935(v=ws.10).aspx允许某些用户打开端口。

netsh http 添加 urlacl url= http://+:80/Uriuser=DOMAIN\User listen=yes

于 2014-02-14T16:40:23.110 回答