我有一个作为本地系统运行的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;
}
}