2015-03-23 10 views
19

Zajmuję się programowaniem antykradzieżowym, aby uzyskać dokładną lokalizację komputerów. Notebooki z wbudowanym gps są bardzo rzadkie w moim kraju, więc w mojej aplikacji muszę używać HTML5 Geolocation.Jak korzystać z geolokalizacji HTML5 w aplikacji C#

W przeglądarce Internet Explorer 9+ dostępny jest klucz rejestru, w którym można dodawać adresy URL, aby umożliwić korzystanie z adresu URL bez konieczności weryfikacji użytkownika. Jeśli dodasz wartość REG_DWORD o nazwie domain.com pod HKCU\Software\Microsoft\Internet Explorer\Geolocation\HostConsent przeglądarka ścieżek automatycznie zezwoli na żądanie geolokacji. Jednak nie mogę uruchomić przeglądarki Internet Explorer, więc nie działa ona dla mnie, ponieważ złodziej nie powinien zdawać sobie sprawy z tego, co się dzieje.

  • trzeba uruchomić Internet Explorer ukryte jakoś
  • ... czy muszę osadzić WebKit lub coś do mojego wniosku, ale nie wiem, jak mogę go używać i jak mogę pozwolić ten wniosek programowo .

Preferuję drugą drogę, ponieważ Internet Explorer jest teraz zakończony przez Microsoft i myślę, że następna wersja będzie miała inną strukturę.

Jak mogę zamieścić i użyć Webkit lub GeckoFX do mojej aplikacji? Jak mogę programowo zezwolić na wniosek geolokalizacji w tej aplikacji?

+0

Naprawdę NIE należy używać HTML 5 na serwerze. Przekraczasz granice bez żadnej przewagi. Rozumiem, o co ci chodzi, ale możesz to odwrócić. Rozważ skorzystanie z C# Google Maps zamiast: http://www.codeproject.com/Tips/889136/Csharp-Google-Maps-in-WinForm-w-WebBrowser- i –

+0

@DaveAlperovich Właściwie chcę używać HTML5 po stronie klienta. Klient odwiedzi stronę [taką jak ta] (http://html5demos.com/geo) i wyśle ​​zwróconą informację do serwera. – Batuhan

+1

Kiedy wyobrażam sobie oprogramowanie zabezpieczające, wyobrażam sobie pulpit (aplikacja WinForm/WPF). Samoekapsułowana aplikacja natywna korzystająca z natywnych sterowników do wykrywania, czy użytkownik nie uwierzytelnił się ... Może wysyłanie własnych wyzwań związanych z uwierzytelnianiem. Jeśli użytkownik je zawiedzie, zażądaj usługi geolokalizacji (takiej jak GMAP). Taka aplikacja może działać jako Deamon z uprawnieniami administratora, co utrudnia intendentowi identyfikację, a nawet trudniejsze wyłączenie. Zależność od dodatkowej aplikacji, takiej jak przeglądarka, zmniejszyłaby wydajność Twojej aplikacji zabezpieczającej (przeglądarki są odłączone od systemu operacyjnego) i jest bardziej delikatna. –

Odpowiedz

8

Poleganie na ukrytej przeglądarce to ryzykowne rozwiązanie, które w przyszłości nieuchronnie zepsuje się.

Zamiast tego chcesz zbudować funkcję geolokalizacji w swojej aplikacji. Dwoma głównymi źródłami informacji o lokalizacji są Twój adres IP (który następnie można przesłać do dowolnej z GeoIP providers) i widoczne są stacje komórkowe/Wi-Fi (które są podawane do Google geolocation API).

+0

Dzięki! Że Google API jest tym, czego potrzebuję. Czy wiesz, w jaki sposób mogę uzyskać wymagane informacje o Wi-Fi, takie jak siła sygnału, stosunek sygnału do szumu, kanał w mojej aplikacji C#? Czy są w tym jakieś biblioteki? – Batuhan

+0

@Batuhan: Szybkie wyszukiwanie "C# sygnału WiFi strength" zwraca [this] (http://stackoverflow.com/questions/18758097/getting-wifi-signal-strength). Nie sądzę, że inne interfejsy API będą trudniejsze do znalezienia. – voithos

1

Możesz osadzić przeglądarkę Webkit w swojej aplikacji za pomocą PhantomJS. PhantomJS to bezgłowy przeglądarka, którą można dodać do aplikacji poprzez wyszukiwanie NuGet lub linię poleceń NuGet PM> Install-Package PhantomJS. Po PhantomJS został dodany do projektu, będziemy chcieli, aby utworzyć plik kontrolować fantomowe coś takiego:

public string PhantomJson(string phantomControlFile, params string[] arguments) 
     { 
      string returnJsonString = String.Empty; 

      if (!String.IsNullOrEmpty(URL)) 
      { 
       ProcessStartInfo startInfo = new ProcessStartInfo 
       { 
        CreateNoWindow = true, 
        RedirectStandardError = true, 
        RedirectStandardOutput = true, 
        FileName = Path.Combine(PhantomExecutionPath, "phantomjs.exe"), 
        UseShellExecute = false, 
        WorkingDirectory = PhantomExecutionPath, 
        Arguments = @"--proxy-type=none --ignore-ssl-errors=true {1} ""{0}"" {2}".FormatWith(URL, phantomControlFile, 
         arguments.Any() ? String.Join(" ", arguments) : String.Empty) 
       }; 

       StringBuilder receivedData = new StringBuilder(); 
       using (Process p = Process.Start(startInfo)) 
       { 
        p.OutputDataReceived += (o, e) => 
        { 
         if (e.Data != null && e.Data != "failed") 
         { 
          //returnJsonString = e.Data; 
          receivedData.AppendLine(e.Data); 
         } 
        }; 
        p.BeginOutputReadLine(); 
        p.WaitForExit(); 
       } 
       returnJsonString = receivedData.ToString(); 

       if (!String.IsNullOrEmpty(returnJsonString)) 
       { 
        return returnJsonString; 
       } 
       else 
       { 
        throw new ArgumentNullException("Value returned null. Unable to retrieve data from server"); 
       } 
      } 
      else 
      { 
       throw new ArgumentNullException("Url cannot be null"); 
      } 
     } 

Następnie będziemy chcieli zbudować plik kontrolny powiedzieć phantomjs gdzie iść; coś takiego:

var args, myurl, page, phantomExit, renderPage, system; 

system = require("system"); 
args = system.args; 
page = null; 
myurl = args[1]; 

phantomExit = function(exitCode) { // this is needed as there are time out issues when it tries to exit. 
    if (page) { 
    page.close(); 
    } 
    return setTimeout(function() { 
    return phantom.exit(exitCode); 
    }, 0); 
}; 

renderPage = function(url) { 
    page = require("webpage").create(); 
    return page.open(url, function(status) { 
     if (status === 'success') { 
     // Process Page and console.log out the values 
     return phatomExit(0); 
     } else { 
     console.log("failed"); 
     return phantomExit(1); 
     } 
    }); 
    }; 
    renderPage(myurl); 
4

Wystarczy popatrzeć na klasy GeoCoordinateWatcher która jest określona w zespole System.Device

danych lokalizacji klasy materiały GeoCoordinateWatcher koordynować opartych od obecnego dostawcy lokalizacji. Bieżący dostawca lokalizacji jest traktowany priorytetowo jako najwyższy na komputerze, na podstawie wielu czynników, takich jak wiek i dokładność danych od wszystkich dostawców, dokładność wymagana przez aplikacje lokalizacyjne oraz wpływ zużycia energii i wydajności związany z dostawca lokalizacji. Obecny dostawca lokalizacji może się zmieniać z czasem, na przykład, gdy urządzenie GPS utraci sygnał satelitarny w pomieszczeniu, a dostawca triangulacji Wi-Fi stanie się najdokładniejszym dostawcą na komputerze.

Przykład użycia:

static void Main(string[] args) 
{ 
    GeoCoordinateWatcher watcher = new GeoCoordinateWatcher(); 

    watcher.StatusChanged += (sender, e) => 
    { 
     Console.WriteLine("new Status : {0}", e.Status); 
    }; 

    watcher.PositionChanged += (sender, e) => 
    { 
     Console.WriteLine("position changed. Location : {0}, Timestamp : {1}", 
      e.Position.Location, e.Position.Timestamp); 
    }; 

    if(!watcher.TryStart(false, TimeSpan.FromMilliseconds(5000))) 
    { 
     throw new Exception("Can't access location"); 
    } 

    Console.ReadLine(); 
} 

Myślę, że ta klasa opiera się na tym samym mechanizmie niż jednokrotnym użyciu przeglądarki Internet Explorer.

Kiedy z niego skorzystasz, na pasku powiadomień systemu pojawi się ikona z informacją, że lokalizacja została ostatnio udostępniona.

enter image description here

Trzeba będzie również wpis dodany okien dzienników.

+0

To jest rodzimy i elegancki sposób wykonywania pracy, dziękuję! Ale myślę, że Windows nie pozwoli mi wyłączyć tych powiadomień ze względu na jego politykę prywatności. Szukam więcej tajności, ponieważ to wszystko jest oprogramowaniem antykradzieżowym i nie chcę mówić "Cześć złodzieju, wiem, gdzie jesteś!" :) – Batuhan

2

Jeśli wdrażasz nowszą wersję systemu Windows, możesz użyć biblioteki macierzystej do .NET System.Device.Location, która pozwala uzyskać informacje o lokalizacji urządzenia.

Oto link na MSDN na jak go używać GeoCoordinate Class

przypadku korzystania z XAML, można również spróbować tej metody. Detect Users Location using XAML

Powiązane problemy