Freitag, 25. Juli 2014

Prüfen ob Antivirenprogramm installiert

Heute möchte ich zeigen, wie man mittels C# prüfen kann, ob ein Antivirenprogramm installiert ist. Dies tun wir durch eine WMI Abfrage, im verlinkten Post habe ich eine kleine Einleitung in dieses Thema gegeben.
Der hierfür benötigte Pfad lautet root/SecurityCenter2/AntiVirusProduct, die Anfrage gibt uns dann für jedes installierte Antivirus Produkt ein Objekt zurück mit einigen Attributen, unter anderem natürlich Name, Produktstatus, Pfad zur .exe und Datum (displayName, productState, pathToSignedProductExe und timestamp).
In dem oben verlinkten Post habe ich auch über den WMI Object Browser geschrieben, mit welchem sich die WMI durchsuchen lässt und welcher die Bedeutung einiger Attribute erklärt. Für die hier verwendete Klasse findet sich leider keine Erklärung, auch sonst findet sich online leider nur wenig. So weiß ich zum Beispiel nicht, was timestamp aussagen soll, über die Bedeutung des productState gibt es hier eine nette Theorie. Über Hinweise und Erklärungen würde ich mich sehr freuen.
Unser Hauptziel aber, nämlich das einfache Erfragen, ob und wenn ja welche Virenscanner installiert sind, haben wir ja erreicht, der Code:
            ManagementObjectSearcher MySearcher =
               new ManagementObjectSearcher("root\\SecurityCenter2", "SELECT * FROM " + "AntiVirusProduct");

            string Result = "";

            foreach (ManagementObject queryObj in MySearcher.Get())
            {
                Result += "New Product:" + Environment.NewLine;
                foreach (PropertyData propertyData in queryObj.Properties)
                {
                    Result += propertyData.Name.ToString() + ":" + propertyData.Value.ToString() + Environment.NewLine;
                }
            }

Mittwoch, 23. Juli 2014

WMI Administrative Tools (insbesondere den WMI Object Browser) verwenden

WMI steht für Windows Management Instrumentation, mit ihr kann lokal oder über Netzwerk auf nahezu alle Einstellungen eines Computers zugegriffen werden, schreibend wie lesend.
Bei der C# Programmierung können wir diese auch benutzen und so interessante Systemeinstellungen auslesen oder vornehmen, wie zum Beispiel einen Systemwiederherstellungspunkt erstellen.
In diesem Post geht es jedoch nicht um .Net Programmierung, sondern um die Benutzung der WMI Administrative Tools, genauer gesagt des Objekt Browsers davon.
Wie der Name schon sagt, lässt sich mit diesen von Windows bereitgestellten Tools die WMI verwalten, Informationen über enthaltene Klassen können abgerufen werden etc.
Für uns als Programmierer ist wahrscheinlich der enthaltene WMI Object Browser interessant. Mit diesem können die Namespaces und Klassen der WMI durchsucht werden, dabei werden teilweise Informationen über deren Sinn und Verwendung angezeigt - was sehr nützlich für uns sein kann, wenn wir zum Beispiel eine Eigenschaft auslesen und wissen wollen, wofür die eingetragenen Attribute stehen.
Da man bei der Verwendung des Browsers einige Sachen beachten muss um ihn zum Laufen zu kriegen, möchte ich hier kurz eine Anleitung posten:

  • Zuerst müsst ihr die Datei "browser.htm" aus dem WMI Tools Verzeichnis im Internet Explorer  als Administrator öffnen, bei mir C:\Program Files (x86)\WMI Tools\browser.htm. Das Ausführen der geblockten Inhalte müsst ihr dann zulassen.
  • Mit aktuellen IE Versionen funktioniert der Browser nicht, deswegen müssen wir im Kompatibilitätsmodus IE 7 auswählen. Dafür F12 drücken und unter "Dokumentmodus" und "Zeichenfolge des Benutzer-Agents" (Internet Explorer) 7 auswählen.


  • Dann sollte ein Fenster erscheinen, in welchem ihr euch zu einem Namespace verbinden könnt.


  • Schließend solltet ihr so ein Fenster zu Gesicht bekommen, in welchem dann, wie schon erwähnt, die verfügbaren Klassen etc. aufgelistet sind.

Sonntag, 13. Juli 2014

(Falschen) Standort über Facebook posten

Nach den beiden vorbereitenden Posts möchte ich heute nun zeigen, wie man auf Facebook seine Position posten kann, hierbei aber jeden beliebigen Ort als diese unterschummeln kann.
Wir benutzen den Code des Posts Facebook Posts veröffentlichen, erweitern dort nur die übergebenen Daten um den Parameter place. Mit diesem können wir unseren (angeblichen) Standort angeben, sodass dann unter dem Post "in X" steht.
Als place können wir entweder, wie hier unter Tagging Places beschrieben, die URL eines externen Open Graph Objekts mit Positionsangaben angeben, oder die ID einer Facebook Seite.
Wie man Orte über Facebook suchen kann und so ihre benötigte ID ermitteln kann, habe ich im vorigen Post beschrieben.
Und so führt folgender Code zu folgendem Resultat:

            string URL;
            URL = "https://graph.facebook.com/me/feed/";

            WebRequest MyRequest;
            MyRequest = WebRequest.Create(URL);
            MyRequest.Method = "POST";

            Stream DataStream = MyRequest.GetRequestStream();

            Byte[] Data = Encoding.UTF8.GetBytes("access_token=ACCESS_TOKEN&message=Getting ready for the game. Go Germany! But may the better win, good luck.&place=110346955653479");

            DataStream.Write(Data, 0, Data.Length);
            DataStream.Close();

            MyRequest.GetResponse();


Mit Facebook Plätze suchen

In diesem Post möchte ich zeigen, wie man über die Facebook API Suchanfragen durchführt, insbesondere zu Plätzen (Orten) - places auf englisch. Das Prinzip ist dasselbe wie beim generellen Auslesen von Daten von Facebook, nur dass wir hier die Suchfunktion nutzen. Aus diesem Grund brauchen wir auch, im Gegensatz zu dem Beispielprogramm aus dem vorigen Post, ein user access token. Wie man dieses erhält, könnt ihr dem verlinkten Post entnehmen.
Bei der Suche nach Orten gibt es dann mehrere Möglichkeiten, ich werde hier 2 vorstellen: Über Koordinaten oder Schlagworte.
Um nach Plätzen in der Nähe bestimmter Koordinaten zu suchen, ist folgende Abfrage nötig:

https://graph.facebook.com/search?access_token=ACCESS_TOKEN &type=place&center=BREITENGRAD,LÄNGENGRAD &distance=ENTFERNUNG"

Hierbei sind die Platzhalter in Großbuchstaben durch die richtigen Angaben zu ersetzen. Breiten- und Längengrad müssen in Dezimalschreibweise (Punkt als Trennzeichen) eingegeben werden, positive Werte stehen für Nord bzw Ost, negative für Süd bzw. West. So ist zum Beispiel (37° 27′ N, 122° 11′ W) = 37.27, -122.11.
Über den Parameter distance kann die Entfernung von den Koordinaten in Metern angegeben werden, bis zu welcher Orte gesucht werden sollen.

Um nach Schlagwörtern zu suchen benutzen wir

https://graph.facebook.com/search?access_token=ACCESS_TOKEN &type=place &q=KEYWORDS

Mittels des Parameters q können Schlagwörter eingegeben werden, welche den Ort beschreiben, zum Beispiel Teile des Names, die Stadt in welcher er sich befindet etc.

Beide Anfragen können natürlich wie immer auch im Browser ausgeführt werden, oder wir benutzen eine HTTP Abfrage in C#.
Bevor wir zum Code kommen, müssen wir noch kurz auf das Ausgabeformat zu Sprechen kommen. Führt man die Abfrage https://graph.facebook.com/search?access_token=ACCES_TOKEN&type=place&q=aachen im Browser aus, erhält man das folgende Ergebnis:

{
   "data": [
      {
         "category": "Club",
         "category_list": [
            {
               "id": "354275401259620",
               "name": "Nightlife"
            }
         ],
         "location": {
            "street": "Liebigstra\u00dfe 19",
            "city": "Aachen",
            "state": "",
            "country": "Germany",
            "zip": "52070",
            "latitude": 50.789739317735,
            "longitude": 6.1094749147791
         },
         "name": "STARFISH-Aachen.de",
         "id": "106940009344240"
      },
...

Das Ergebnis wird im JSON Format ausgeben, was für JavaScript Object Notation steht und ein einfaches Textformat zum Datenaustausch darstellt.
Um das Format in C# interpretieren zu können, benutzen wir Json.Net, welches hier heruntergeladen werden kann. Danach müssen wir im Projekt einen Verweis auf die Newtonsoft.Json.dll hinzufügen, welche sich im BIN Verzeichnis der Installation und dann dem entsprechenden .Net Versionsordner befindet.
Das folgende Programm sucht Orte in der Nähe der angegebenen Koordinaten und gibt ID, Name etc. dieser in einem Textfeld aus:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Net;
using System.IO;
using Newtonsoft.Json.Linq;

namespace FacebookSearch
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string RequestURL;
            RequestURL = "https://graph.facebook.com/search?access_token=ACCESS_TOKEN" +
            "&type=place&center=52.3110,13.2424&distance=1000";

            // using Keywords:
            // RequestURL = "https://graph.facebook.com/search?access_token=ACCESS_TOKEN&type=place&q=aachen";

            WebRequest GetRequest;
            GetRequest = WebRequest.Create(RequestURL);

            Stream ResponseStream;
            ResponseStream = GetRequest.GetResponse().GetResponseStream();
            StreamReader ResponseReader = new StreamReader(ResponseStream);

            string TempLine = ResponseReader.ReadLine();

            JObject FoundPlaces = JObject.Parse(TempLine);

            foreach (var x in FoundPlaces["data"].Children())
            {
                string CategoryName = "";

                textBox1.Text += "Name:" + x["name"].ToString() + "   ID: " + x["id"] +  "   City: " + x["location"]["city"] + "    Street: " + x["location"]["street"] + Environment.NewLine;
            }

        }
    }
}

Samstag, 12. Juli 2014

Länger gültige Facebook Access Tokens

In vorigen Posts habe ich über die Verbindung von C# und Facebook geschrieben (siehe dazu das entsprechende Label).
In einigen davon (z.B. beim Posten von Statusnachrichten) benötigten wir ein sogenanntes Access Token, welches unserer Anwendung die benötigten Rechte einräumt. Auf diese Access Tokens möchte ich in diesem Post etwas näher eingehen, da Facebook die Gültigkeit dieser verkürzt hat.
Wie man hier nachlesen kann, gibt es verschiedene Arten von Access Tokens, z.B. App Access Tokens und User Access Tokens. App Access Tokens werden von jeder Anwendung benötigt, welche auf Facbeook zugreifen möchte und können einfach durch Angabe von App ID und App Secret erworben werden.
Möchte man jedoch nutzerbezogene Aktionen wie zum Beispiel das eben erwähnte Posten von Statusnachrichten vornehmen, benötigt man ein User Access Token, welches durch den Nutzer authorisiert ist. Mit diesem Tokentyp möchten wir uns hier beschäftigen.
Token dieser Art können manuell über den Graph API Explorer erworben werden, für welchen wir uns mit dem gewünschten Benutzeraccount anmelden. Dann wählen wir oben in der Dropdownleiste die gewünschte Anwendung aus, für welche das Token gültig sein soll und klicken auf "Get Access Token". Im sich nun öffnenden Fenster wählen wir die benötigten Rechte aus und bestätigen, der Tokenstring ist dann im Textfeld vorhanden. Diesen String können wir nun im Programmcode benutzen und so, zum Beispiel, Dinge posten.
In früheren Posts hatte ich es nun hiermit belassen, da die Tokens recht lange gültig waren. Dies hat Facebook nun jedoch geändert, Tokens sind jetzt nur noch 1 - 2 Stunden gültig. Das Auslaufdatum der Tokens und andere Informationen können über den Facebook Debugger geprüft werden.

Schreiben wir nun eine Anwendung, die mit Facebook arbeitet, müssten wir manuell alle 1 - 2 Stunden ein neues Token anfordern, was natürlich nicht praktikabel ist. Da das codeseitige Anfordern eines Tokens nicht so leicht ist, entschied ich mich für die folgende Variante: Wir erzeugen einmalig aus dem oben erzeugten Token eines, welches deutlicher länger gültig ist und übergeben dies der Anwendung.
Zu dieser Sache gibt es hier eine Hilfeseite von Facebook, in welcher mehrere Alternativen vorgeschlagen werden, wir verwenden die vierte. Wie dort beschrieben, führt das Aufrufen der folgenden Adresse im Browser zur Erzeugung eines neuen Access Tokens, welches dann ausgegeben wird:

https://graph.facebook.com/oauth/access_token?
client_id=APP_ID&
client_secret=APP_SECRET&
grant_type=fb_exchange_token&
fb_exchange_token=EXISTING_ACCESS_TOKEN
In dem Aufruf ist APP_ID durch die ID der App zu ersetzen, APP_SECRET durch das App Secret und EXISTING_ACCESS_TOKEN durch das oben erzeugte kurzfristige Access Token. Das so erzeugte Token hat dann eine Gültigkeit von ca. 2 Monaten.