0

我有一个作为本地系统运行的Windows 服务应用程序,我希望能够使用 NATUPNPLib 为它需要的(多个和动态)端口创建端口转发。我一直在尝试其他各种 失败的 UPnP 库,这就是为什么当我测试 NATUPNPLib 并且它在我的测试应用程序中工作时我非常兴奋。

将相同的代码放入在本地系统帐户下运行的服务中时,问题就出现了。我总是得到错误The owner of the PerUser subscription is not logged on to the system specified (Exception from HRESULT: 0x80040210)。这个库或这些错误几乎没有文档(事实上,您需要在 VS2008 中为 .NET 3.5 生成互操作,因为 VS2010 总是出错)。我从错误本身收集到的是本地系统用户无权访问 UPnP。

更改服务运行的用户帐户并非易事,除了应用程序是自动更新的并且旨在需要很少的配置这一事实。

有没有人让 NATUPNPLib 在本地系统下工作,或者找到了一个可以在 C# 中使用的像样的 UPnP 库?

这是我正在使用的代码,再简单不过了!

    /// <summary>
    /// Use NATUPNPLib to try and open a port forward
    /// </summary>
    /// <param name="intPortNumber">The port to open</param>
    /// <param name="strFriendlyName">Friendly name for the service</param>
    /// <returns>Boolean indicating whether the forward worked</returns>
    public static bool OpenUPnP(int intPortNumber, string strFriendlyName)
    {
        try {
            NATUPNPLib.UPnPNATClass upnpnat = new NATUPNPLib.UPnPNATClass();
            upnpnat.StaticPortMappingCollection.Add(intPortNumber, "TCP", intPortNumber, GetListenIP().ToString(), true, strFriendlyName);

            Database.AddLog("Opened port " + intPortNumber + " for " + strFriendlyName, "networking");
            return true;
        }
        catch(Exception e) {
            Database.AddLog("Unable foward port " + intPortNumber + " for " + strFriendlyName + ": Exception - " + e.Message, "networking", "warn");
            return false;
        }
    }

这是Networking.cs的一部分

4

1 回答 1

0

事实证明,这更多是在 BT 的 Home Hub 3 上实施 UPnP 的问题。在扩展安全性的情况下,它将这个虚假的错误代码返回给 NATUPnPLib,如果没有它,某些端口上仍然会出错。

你可以在本地系统下运行 UPnP 命令,只要你的路由器不是一堆便便。

于 2011-10-11T13:09:12.357 回答