Совместное использование рабочего стола C# с помощью Windows Desktop Sharing API

Я написал простое приложение на C# для общего доступа к рабочему столу с использованием Windows API для общего доступа к рабочему столу.

http://msdn.microsoft.com/en-us/library/bb968809.aspx http://blogs.msdn.com/b/rds/archive/2007/03/08/windows-desktop-sharing-api.aspx

Большая часть кода моего приложения основана на этом посте в блоге Microsoft http://blogs.msdn.com/b/rds/archive/2007/03/23/writing-a-desktop-sharing-application.aspx

Я также успешно внедрил Reverse Connect http://msdn.microsoft.com/en-us/library/aa373312.aspx

Мое приложение отлично работает в локальной сети или VPN, но я не могу предоставить доступ к рабочему столу ПК, находящимся в публичных сетях. Приглашение, сгенерированное моим хост-приложением, выглядит примерно так

<E>
  <A KH="3tSA+NXzzvG8ynVkXTh0RxsPCus=" ID="DIC/0Flybjfj3U5lPvy5B2TWwShPrX1oIkpUB0vrB4mZsjZWY7WCfGnvEUjwhvhK"/>
  <C>
    <T ID="1" SID="0">
      <L P="51390" N="fe80::596d:88b0:2ef6:bf13%4"/>
      <L P="51391" N="fe80::103c:155b:b1fc:9854%9"/>
      <L P="51392" N="2001:0:9d38:6abd:103c:155b:b1fc:9854"/>
      <L P="51393" N="2002:c31d:e328:1000:981c:91bc:adbd:6703"/>
      <L P="51394" N="2002:c31d:e328:1000:c878:a88a:f1fb:f25d"/>
      <L P="51395" N="fe80::981c:91bc:adbd:6703%10"/>
      <L P="51396" N="192.168.1.36"/>
    </T>
  </C>
</E>

Я заметил, что в этом приглашении указан только локальный IP-адрес. Я что-то здесь не так делаю? Можно ли вообще использовать рабочий стол для ПК в общедоступной сети с помощью Windows Desktop Sharing API?

Если нет, каковы мои варианты? Другое тогда настройка VPN? Спасибо

4 ответа

Вы можете использовать это:

// you need to fix the port in order to know the port 
// that  StartReverseConnectListener will use
IRDPSRAPISessionProperties RdpProperties = Viewer.Properties as IRDPSRAPISessionProperties;
RdpProperties["PortId"] = Myport;


 private string AddExIP(string viewerConnectionString)
        {
            TextReader tr = new StringReader(viewerConnectionString);
            XDocument doc = XDocument.Load(tr);

            // get external ip 
            // From http://stackru.com/a/16109156/2573450
            string url = "http://checkip.dyndns.org";
            System.Net.WebRequest req = System.Net.WebRequest.Create(url);
            System.Net.WebResponse resp = req.GetResponse();
            System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());
            string response = sr.ReadToEnd().Trim();
            string[] a = response.Split(':');
            string a2 = a[1].Substring(1);
            string[] a3 = a2.Split('<');
            string a4 = a3[0];
            string ExternalIp = a4;

            // Add to connection string
            doc.Element("E").Element("C").Element("T").Add(new XElement("L",
                new XAttribute("P", MyportasString),
                new XAttribute("N", ExternalIp)
                ));
            return doc.ToString();
        }

string viewerConnString = Viewer.StartReverseConnectListener(SessionInvitation, Myname, Mypass);

String NewConnectionString = AddExIP(viewerConnString);

В приглашении на рабочем столе я вижу два публичных IPv6-адреса. Один с 2001: его IPv6-адрес teredo создан с использованием механизма обхода ipv4 NAT, а другой с 2002: префикс, означающий его адрес 6to4. Если другой компьютер также имеет общедоступный адрес IPv6, это приглашение должно работать. На всех платформах Windows, начиная с Vista, по умолчанию инициализируется IPv6-адрес Teredo или 6to4. Адрес 6to4 & teredo будет недоступен, если ваша машина находится за симметричным NAT или за прокси-сервером. Пожалуйста, проверьте, имеет ли другой компьютер адрес ipv6. Если он есть, он должен работать.

Если вы пытаетесь подключиться к ПК, который не имеет общедоступного IP-адреса, вам необходимо настроить брандмауэр или NAT с некоторыми правилами перенаправления портов. Затем используйте этот публичный IP (например, WAN IP на маршрутизаторе) в строке приглашения.

Вы можете туннелировать данные через произвольный транспорт, реализуяIRDPSRAPITransportStream. Передайте свой транспорт дольщику с помощьюIRDPSRAPISharingSession2::ConnectUsingTransportStreamметод, а клиенту с помощью IRDPSRAPIViewer::get_Propertiesс имуществом"SetNetworkStream".

Полный пример доступен по адресу https://github.com/mgaffigan/RemoteAssistanceSample .

Другие вопросы по тегам