OneNote API: Der Juni bringt Neues für die Beta

Anfang diesen Jahres wurde die OneNote REST API für den Zugriff auf die online abgelegten OneNote-Notizbücher veröffentlicht. Damit ist es möglich in eigenen Anwendungen das Speichern von Informationen in das eigene Notizbuch zu implementieren.
Leider fehlt es der API bislang an wesentlichen Funktionen: Man kann nicht vorgeben, wohin man im Notizbuch speichern möchten - die angelegte Seite wird automatisch in den Default-Bereich “Nicht abgelegte Notizen” geschrieben - und es ist nicht möglich, Informationen aus den Notizbüchern gezielt zu lesen. Diese Mängel stellten die an sich gute Idee erheblich in den Schatten und machten sie weitestgehend uninteressant für Entwickler.
Nachdem seit April nur wenig spannende Neuigkeiten zur Web-Schnittstelle veröffentlicht wurden, informierte man kürzlich ohne großes Aufsehen, dass diese beiden Funktionen nun in der Beta zur Verfügung stehen.

Am 12. Juni wurde im OneNote API Developer Blog bekanntgegeben, dass das Anlegen von Inhalten an beliebigen Stellen im Notizbuch funktioniert und am 18. Juni das Lesen von allen Notizbüchern, deren Bereichsgruppen, Bereichen und Seiten.

Testen kann man die neuen Funktionen bereits in der Beta-Version der Schnittstelle; am schnellsten per OneNote APIGee Console:

1. Sammlung der Notizbücher abrufen…

OneNote API - Notizbücher abrufen

2. Die im Notizbuch enthaltenen Bereiche abrufen…

OneNote API - Bereiche im Notizbuch abrufen

3. Die im Bereich enthaltenen Seiten abrufen…

OneNoteApi_Pages

Die Vermutung liegt nahe, dass die in der Beta verfügbaren Funktionen ebenfalls bald in den Release der API eingehen. In dem Falle steht der Entwicklung eigener Anwendungen mit direkter OneNote-Anbindung nichts mehr im Wege…

PowerShell für Developer

Das eigentliche Killer-Feature der PowerShell ist tatsächlich die konsequent durchgesetzte Objektorientierung. Es muss ja nicht unbedingt immer gleich ein ganzes Script sein. Oft genug genügen auch ein paar .NET Objekte, die man sich mit wenigen Zeilen Code/Command(let)s von der ersten Property bis zu letzten Methode zu Gemüte führen kann.
Ganz besonders reizvoll wird dies bei APIs von komplexen Systemen, wie z. B. Microsoft SharePoint, mit deren Hilfe man per PowerShell auf dem gesamten Objektmodell mit minimalem Aufwand lesen und manipulieren kann.

Wie im letzten PowerShell-Post, hier ein paar meiner Favoriten kurz und knapp zusammengetragen:

#1 Get-Member: Objekt-Analyse

Direkt an der Konsole fehlt üblicherweise IntelliSense. Da man Eigenschaften und öffentliche Methoden von Objekten selten alle im Kopf hat, ist Get-Member das aus meiner Sicht wichtigste Cmdlet der PowerShell – ganz besonders dann, wenn man etwas abseits der Cmdlets mit .NET Objekten arbeitet. Den Spickzettel zu jedem Objekt gibt’s auf Befehl (im Beispiel für ein System.IO.FileInfo-Objekt) per Get-Member.

dir | Get-Member

Fehlen Methoden oder Eigenschaften, kann man dem Cmdlet mit der Option -Force noch ein wenig mehr Informationen entlocken.

dir | Get-Member -Force

#2 Invoke-WebRequest: Daten aus dem Netz verwenden

Mit einem Web Request Daten aus dem Netz laden: Beim Entwickeln von Software vor allem dann populär, wenn es um das Ansprechen von Web-APIs geht. Im nachfolgenden Beispiel wollen wir ein Diablo III Spielerprofil via REST Webservice abrufen.

// Daten abrufen; vorerst "Plain" per .NET Klassenbibliothek und dem WebClient
(New-Object System.Net.WebClient).DownloadString("http://eu.battle.net/api/d3/profile/quatze-2409/")
// Ganz ähnlich aber viel kürzer geht es mit dem Invoke-WebRequest Cmdlet, welches mit PS 3.0 eingeführt wurde
Invoke-WebRequest http://eu.battle.net/api/d3/profile/quatze-2409/

Soweit so gut aber wirklich arbeiten kann man damit noch nicht, da wir lediglich die JSON-Struktur in einem String haben. Mehr dazu mit dem nächsten Cmdlet…

#3 ConvertFrom-Json: Rückgabe des REST Webservice verarbeiten

Um mit den aus #2 abgerufenen Informationen zu arbeiten, kann man den abgerufenen String umständlich von Hand parsen und zerschneiden oder man konvertiert ihn in ein .NET Objekt. Das Cmdlet ConvertFrom-Json bringt hierfür alles mit, was wir benötigen.

// Der vom REST Webservice abgerufene String wird an das Cmdlet ConvertFrom-Json übergeben, welches ein Custom Object erzeugt
Invoke-WebRequest http://eu.battle.net/api/d3/profile/quatze-2409/ | ConvertFrom-Json
// In einem Schritt und ohne explizites Konvertieren erzeugen wir mit dem Cmdlet Invoke-RestMethod das Custom Object, ...
$d3profile = Invoke-RestMethod http://eu.battle.net/api/d3/profile/quatze-2409/
// ...an welchem wir alle Helden nebst Primärattribute im Spielerprofil ausgeben lassen können
$d3profile.heroes | ft name, level, hardcore, gender, last-updated -AutoSize

#4 Range Operator

Es klingt profan aber die Idee dahinter spart Zeit und Code: Der Range-Operator der PowerShell zum einfachen Erzeugen von nummerischen Bereichen. Praktischer Nutzen? Kommt sofort…

// 1 bis 10 ausgeben; zugegeben - eher unspannend aber es erklärt die Funktionsweise
1..10

// Alles von A-Z; immer noch kein umwerfendes Feature aber durchaus praktisch
65..90 | % { [char]$_ }
// Ein Array mit 23 bis 42 initialisieren
$a = 23..42
$a.Length
// Drei mal gpupdate ausführen mit jeweils 10 Sekunden Pause
1..3 | % { gpupdate ; "Update #$_ $(Get-Date) done." ; Start-Sleep 60 }

#5 [] als Indexer

Nur der Vollständigkeit halber noch zu erwähnen: Zugriffe auf Collections und Arrays sind analog zur C#-Syntax möglich…

// Hier im Beispiel des Arrays aus #4
$a[5]

 

Mehr Informationen zur PowerShell und den Standard-Cmdlets aus dem Microsoft.PowerShell.Utility Modul findet man im TechNet.

Structure Visualizer for SharePoint

SharePoint VisualizerVon Zeit zu Zeit stehe ich vor der Herausforderung, Strukturen einer SharePoint Site oder eines SharePoint Webs grafisch darzustellen. Beispielsweise geht es dabei um Prototypen, deren ERM es in ein Konzept zu integrieren gilt oder man möchte für komplexe Seiten eine “Landkarte” erstellen, so dass neuen Projektpartnern der Einstieg erleichtert wird.
Gerade bei umfangreich verschachtelten Seitenstrukturen oder Datenmodellen mit zahlreichen Beziehungen ist es sinnvoll, Diagramme automatisch und so flexibel als möglich zu generieren. Besonders hilfreich ist es, wenn sich das Diagramm anschließend noch bearbeiten lässt.
Vor einigen Jahren hatte ich mir mit dem SharePoint Analyzer ein eher technisch orientiertes Tool gebastelt, was inhaltlich zwar ausreichend war, jedoch nur bedingt für die Erstellung vorzeigbarer Strukturübersichten geeignet ist…

SharePoint Visualizer ToolBar

Der SharePoint Visualizer vereint als Add-In für Microsoft Visio 2013 die Funktionen zum automatischen Auslesen von Site- und Web-Strukturen und hilft mit zur jeweiligen Seite verlinkten Visio-Shapes bei der Erstellung von aussagekräftigen Übersichten. Bei Bedarf können zusätzlich benutzerdefinierte Berechtigungen jeweils zu Web, Bibliothek oder Liste eingeblendet werden.


SharePoint isualizer SiteStructure

Die Beziehungen von Listen/Bibliotheken zueinander werden nebst Referenzname (Name des Nachschlagen-Felds), Richtung und ggf. Mehrfachnachschlagefunktion als n:m-Relation angezeigt, so dass man die Grafik als vereinfachtes Entity Relationship Diagram verwenden kann.


SharePoint Visualizer RM

Der asynchrone Aufruf der Business-Logik sowie ein wenig mehr “Intelligenz” bei der Darstellung sehr großer Website-Sammlungen fehlen noch – dennoch hier die BETA zum Testen:

“SharePoint-StructureVisualizer_BETA.zip”

QUELLE: OneDrive

GRÖßE: 0,46 MByte

DATUM: 29.06.2014

PowerShell: Schweizer Taschenmesser für alle

PowerShellVöllig unstrittig: Egal ob Bash, Cmd oder PowerShell – es gibt nicht selten Situationen, in denen geht es ohne Kommandozeile schlicht und ergreifend nicht weiter.
Gelegentlich - glücklicherweise zunehmend seltener - wird man trotzdem noch vor die Frage gestellt, was denn nun der Sinn der PowerShell sei, habe man doch alle Möglichkeiten mit der guten, alten Cmd. Dem Aufgeklärten fallen sofort Schlagworte wie objektorientiert und .NET Framework aus dem Gesicht, doch für einen echten Mehrwert reicht das noch nicht ganz. Gerade wenn die PowerShell von Softwareentwicklern beworben wird, schalten ambitionierte Endanwender auch gerne mal in den “brauch-ich-doch-nicht-Modus”, da das Handwerkszeug zu überdimensioniert erscheint, doch ist es das ganz und gar nicht.

Ein paar Beispiele, die mir mit der Zeit sehr ans Herz gewachsen sind und die das Potential haben, das Tagewerk eines jeden Keyboard-Junkies etwas zu erleichtern, kurz und knapp zusammengetragen:

#1 Get-ChildItem: Wer sucht, der findet

Dateien suchen… irgendwo auf der Platte hatte ich sie aber wo? Alles was im Index steckt - wie z. B. Dateien in der Bibliotheken oder dem Home-Folder - ist unproblematisch aber wie finde ich schnell und verlässlich Dateien, die irgendwo in den Untiefen des Systems liegen?
Das dir-Command (genau wie ls) an der PowerShell ist eigentlich ein Alias für das Commandlet Get-ChildItem. Entscheidend ist der Parameter -Recurse, der das Commandlet instruiert in allen erreichbaren Ordnern in/unterhalb des aktuellen Ordners zu suchen. Der Parameter -Filter hilft beim Eingrenzen der gesuchten Dateien.

ls -Recurse -Filter "*.log"

Ist zudem noch der Inhalt der per Get-ChildItem gesuchten Dateien interessant, so hilft die Übergabe der Ergebnisse an Select-String.

ls -Recurse -Filter "*.log" | Select-String "Exception"

#2 In alten DOS-Tools stets Standard: Datei-Attribute modifizieren

Möchte man z. B. das Erstellungsdatum oder das Änderungsdatum von Dateien anpassen, so führte in Prä-PowerShell-Zeiten der Weg gerne über eine hastig improvisierte Konsolenanwendung, welche man bis zum nächsten Einsatz gleich wieder verlegt hatte oder gar über ein Stück zwielichtige Freeware. Mit System.IO.File und einem Einzeiler ist man hier schneller am Ziel.

[IO.File]::SetLastWriteTime("C:\config.sys", (New-Object DateTime 1992, 1, 1))
[IO.File]::SetCreationTime("C:\config.sys", (New-Object DateTime 1992, 1, 1))

#3 Ausgabe in einer Tabelle sortieren und filtern ohne Umwege über Excel

Alles, was im Konsolenfenster passiert, bleibt im Konsolenfenster. Zumindest die Struktur bei tabellarischer Ausgabe kommt leider bei Copy&Paste abhanden. Möchte man mit den Daten weiterarbeiten, schafft hier das Commandlet Out-GridView Abhilfe, welches ein separates Tool zur tabellarischen Darstellung einer jeden PowerShell-Ausgabe startet; hier am Beispiel der letzten 10 Einträge aus dem Eventlog.

Get-EventLog Application -Newest 10 | Out-GridView

#4 Prüfsummen: MD5- oder SHA-Hash schnell berechnet

Nicht nur um zu prüfen, ob eine Datei sich gegenüber einem früheren Zeitpunkt verändert hat, sondern auch um diverse vorkompilierte Binaries aus der OpenSource-Gemeinde auf ihre Authentizität hin zu prüfen, kommt man an MD5 und SHA-Hashes kaum vorbei. Ungünstig nur, wenn man kein Tool zur Hand hat, in welches man den jüngst erworbenen Download stopfen kann. Der Security.Cryptography-Namespace des .NET Framework mit seinen Crypto Service Providern ist hier eine geeignete Anlaufstelle.

# MD5 
[BitConverter]::ToString((New-Object Security.Cryptography.MD5CryptoServiceProvider).ComputeHash((New-Object IO.FileInfo("C:\Windows\write.exe")).OpenRead())).Replace("-","").ToLower()
# SHA
[BitConverter]::ToString((New-Object Security.Cryptography.SHA1CryptoServiceProvider).ComputeHash((New-Object IO.FileInfo("C:\Windows\write.exe")).OpenRead())).Replace("-","").ToLower()

#5 Es wird Zeit: Ticks und Timestamps

Häufig in Log-Dateien und Debugger-Ausgaben anzutreffen – Zeitstempel, die nicht auf den ersten Blick zielsicher im Kalender zuzuordnen sind. Mit einigen Bordmitteln bzw. statischen Methoden des .NET Typs DateTime kommt man den unterschiedlichsten Zeitangaben schnell auf die Schliche.

# Ticks in Datum/Zeit konvertieren 
[DateTime] 634539233533222331
# Datum/Zeit in Unix-Timestamp konvertieren
(([DateTime]::Now) - (New-Object DateTime 1970, 1, 1).ToLocalTime()).TotalSeconds
# Unix-Timestamp in Datum/Zeit konvertieren
(New-Object DateTime 1970, 1, 1).ToLocalTime().AddSeconds(1393023440)

In 20 Jahren vom Organizer zum Smartphone

Waren vor 20 Jahren die heute so omnipräsenten, elektronischen Gadgets eher Randprodukte für den rastlosen Außendienstmitarbeiter, so findet man sie heute in jeder Hosentasche mit einem Vielfachen des damaligen Leistungs- und Funktionsumfangs. Ursprünglich als bessere Taschenrechner mit geringer Speicherkapazität und gewöhnungsbedürftiger Ein- und Ausgabe anstatt Ringbuchplanern genutzt, waren sie neben den Mobiltelefonen nicht minder einer der Wegbereiter für das mobile Internet.

Adressdatenbanken sowie reine PDAs sind nahezu ausgestorben und Smartphones als auch Tablets erfreuen sich größter Beliebtheit. Inzwischen gibt es nur noch wenig, was die kleinen Kisten nicht können. Handy-Kameras mit Pixel-Formaten von DSLRs, 4G-Datenübertragung, WLAN, Bluetooth, NFC, GPS, Social Media Integration, Media-Streaming und Browser, die ihren Desktop-Kollegen das Wasser reichen können, lassen die ursprünglich essentiellen Grundfunktionen wie PIM und Telefonie in den Hintergrund treten.

20 Jahre und ein Nachmittag mit dem Kopf im Technikschrank sollen Grund genug für mein ganz persönliches Resümee‎ sein:

Privileg DB50; Pocket Office CE64; Scall XTS; CasioPocket Viewer PV-100; Philips Nino 210; Siemens S35; Nokia 7110; Casio EM 500G; Nokia7650; HTC PM10A (MDA compact); Asus P750; Samsung Omnia II; Samsung Omnia 7; NokiaLumia 925

…und sie funktionieren alle noch – bis auf den Scall, mangels Service, der 2002 offiziell von eMessage/E*Cityruf eingestellt wurde.

Hier die Übersicht der Geräte:

Hersteller Modell Jahr Betriebssystem Speicher
(MB)
CPU Takt
(MHz)
Privileg DB50 1994 Unbekannt < 1 1
Unbekannt Pocket Office CE64 1996 Unbekannt < 1 4
Scall XTS 1997 Unbekannt - -
Casio Pocket Viewer PV-100 1998 Casio PVOS 1 20
Philips Nino 210 2000 Windows CE 2.11 8 75
Siemens S35 2000 Unbekannt < 1 -
Nokia 7110 2002 Nokia OS Series 40 < 1 -
Casio EM 500G 2003 Windows CE 3.0 16 150
Nokia 7650 2004 Symbian OS 6.1 4 104
HTC PM10A (MDA compact) 2006 Windows CE 4.21 64 416
Asus P750 2008 Windows Mobile 6.0 64 520
Samsung Omnia II 2010 Windows Mobile 6.5 8.192 800
Samsung Omnia 7 2011 Windows Phone 7 16.384 1.000
Nokia Lumia 925 2013 Windows Phone 8 16.384 1.500

Entwicklung von CPU und Speicher mobiler Geräte

Hyper-V Server 2012 beklagt fehlenden RPC-Dienst

Workgroup-Umgebung, ein Hyper-V Server 2012, Standalone, verwaltet von einem Windows 8 Client mit Hilfe des Hyper-V MMC Snap-Ins: Alles funktioniert problemlos.

Von einem Tag auf den nächsten, ohne Änderungen am Setup, meldet das MMC Snap-In, dass der RCP-Dienst auf dem Server nicht erreichbar/verfügbar sei: “Cannot connect to the RPC service on computer ‘HOSTNAME’. Make sure your RPC service is running.”

Das Rätsels Lösung…
Die Ursache war das abgelaufene Kennwort des lokal auf dem Hyper-V Server erstellten Benutzerkontos, welches zur Verwaltung des Servers verwendet wurde.
Der einfachste Lösungsansatz wäre das Ablaufen des Kennworts für dieses Konto zu deaktivieren. Da es sich jedoch um eine Core-Installation handelt, galt es das Problem ohne GUI-Verwaltungstools sondern per PowerShell und WMI zu lösen.

# get all local user accounts 
$localUsers = Get-WmiObject -Class Win32_UserAccount -Namespace "root\cimv2" -Filter "LocalAccount='$True'"
# index 2 is the hyper-v management user identified in $localUsers 
$localUsers[2].PasswordExpires 
# --> True
$localUsers[2].SetPropertyValue("PasswordExpires", $false)
$localUsers[2].PasswordExpires 
# --> False

SharePoint-Berechtigungsstufe kopieren und einschränken

Die Erstellung neuer Berechtigungsstufen (SPRoleDefinition) und vollständiger Definition der Standardberechtigungen (SPBasePermissions) mittels PowerShell ist in wenigen Zeilen Code erledigt. Geringfügig komplexer wird es, will man anhand einer Vorhandenen eine neue Berechtigungsstufe erstellen und lediglich einen einzigen Berechtigungssatz entziehen.
Sicher wäre es ein Einfaches eine neue Berechtigungsstufe unter Aufzählung aller zu gewährenden Rechte anzulegen… gilt es dabei jedoch die bereits definierten Berechtigungen einer Rolle als Vorlage zu verwenden oder eine relativ weitgehend berechtigte Rolle zu erstellen, kommt man mit diesem Ansatz nur über Umwege ans Ziel.

Da die einer Rolle zugewiesenen Berechtigungen in der Berechtigungsstufe als Bitmaske gespeichert werden, ist ein bitweises XOR das Mittel der Wahl: Mit Hilfe des PowerShell-Operators -bXor kann eine einzelne Berechtigung von der vorgegebenen Berechtigungsmaske abgezogen werden.

# open the desired website
$spWeb = Get-SPWeb "URL-to-SharePoint-Web"

# get the originating role definition from the website using the name of the role definition
$spRoleDefAdmin = $spWeb.RoleDefinitions["Vollzugriff"]

# create the new role definition from the template specified above
$spRoleDefAdminReduced = New-Object Microsoft.SharePoint.SPRoleDefinition ($spRoleDefAdmin)

# just some naming stuff
$spRoleDefAdminReduced.Name = $spRoleDefAdmin.Name + " ohne Benutzermanagement"
$spRoleDefAdminReduced.Description = $spRoleDefAdmin.Description.Replace(".", "") + " ohne Benutzermanagement."

# first check, if permission is included in new role definition…
if ($spRoleDefAdminReduced.BasePermissions -band [Microsoft.SharePoint.SPBasePermissions]::ManagePermissions)
{
    # …if so, subtract permission by a bitwise OR (exclusive) operation
    $spRoleDefAdminReduced.BasePermissions = ( $spRoleDefAdminReduced.BasePermissions-bxor [Microsoft.SharePoint.SPBasePermissions]::ManagePermissions )
}

# add the new role definition to the desired website
$spWeb.RoleDefinitions.Add($spRoleDefAdminReduced)

Im Beispiel wird die Berechtigungsstufe “Vollzugriff” (FullMask) als Vorlage für die neue Rolle verwendet, welcher anschließend die Berechtigung “Berechtigungen verwalten” (ManagePermissions) entzogen wird.

Folgen

Erhalte jeden neuen Beitrag in deinen Posteingang.

Schließe dich 75 Followern an