NATUPNPLib из службы в качестве локальной системы - PullRequest
0 голосов
/ 20 сентября 2011

У меня есть приложение службы 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 для работы в локальной системе или нашел приличную библиотеку UPnP, которую я могу использовать в C #?

Вот кодЯ использую, не может быть намного проще!

    /// <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 голосов
/ 11 октября 2011

Оказывается, это больше проблема реализации UPnP на домашнем концентраторе BT 3. С расширенной защитой он возвращает этот ложный код ошибки в NATUPnPLib, а без него все равно выдает ошибки на определенных портах.

Вы можете запускать команды UPnP в локальной системе, если ваш маршрутизатор не куча пу.

...