NATUPNPLib来自作为本地系统的服务

时间:2011-09-20 14:31:35

标签: c# windows-services upnp

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

将相同的代码放入在本地系统帐户下运行的服务时会出现问题。我总是得到错误The owner of the PerUser subscription is not logged on to the system specified (Exception from HRESULT: 0x80040210)。这个库旁边没有文档或这些错误(事实上,你需要在VS2008 for VS 3.5中生成interops,因为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

的一部分

1 个答案:

答案 0 :(得分:0)

事实证明,这更多是在BT家庭集线器3上实施UPnP的问题。随着扩展安全性,它将这个虚假错误代码返回给NATUPnPLib,如果没有它,它仍会在某些端口上出现错误。

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