Exchange-guru sökes - Komma åt kalender från Raspberry Pi

Permalänk
Medlem

Exchange-guru sökes - Komma åt kalender från Raspberry Pi

Hej,

Sysslar med ett litet projekt där tanken är att en Raspberry Pi med en liten skärm ska hängas upp utanför ett bokningsbart mötesrum. På skärmen ska det visas om rummet är ledigt eller bokat samt resterande bokningar för dagen. På något sätt behöver jag alltså komma åt kalenderinformationen för det rummet som finns någonstans på Exchange-servern. Raspberryn kommer att vara uppkopplad på samma nätverk som servern. Tanken är att köra Windows 10 IoT på Raspberryn eftersom att det troligtvis rimmar bra med Exchange. Har hittat följande information:

https://msdn.microsoft.com/en-us/office/office365/api/calenda...

Det verkar alltså som att det hyfsat enkelt ska gå att programmera en app i C# som kan hämta kalenderinformation. Jag är dock helt grön på att utveckla i Microsoft-miljö och hade gärna tagit emot lite vägledning. Det verkar till exempel som att jag behöver något 'access token' för att komma åt servern, antar att det är något som serveradministratören måste sätta upp?

All hjälp uppskattas!

Vänliga hälsningar

Visa signatur

Rigg: ASUS ROG Strix B660-I Gaming WIFI | i5 12400F | Corsair Vengence DDR5, 32 GB | nVidia Geforce GTX 1060 3GB | Samsung 980 PRO, 1 TB

Permalänk
Medlem

Titta på https://code.msdn.microsoft.com/exchange/Exchange-2013-Access... kanske kan vara en bra början? Inget jag sysslat med dock så kan inte hjälpa dig mer specifikt.

Visa signatur

AW3423DW QD-OLED - Ryzen 5800x - MSI Gaming Trio X 3090 - 64GB 3600@cl16 - Samsung 980 Pro 2TB/WD Black SN850 2TB

Permalänk
Medlem

Jag har visserligen enbart använt mig av Exchange Web Services Managed API på en Windows-plattform, men gissningsvis kan samma API användas av Mono på en Linux-plattform.

Du bör inte behöva något annat än följande för att kunna hämta ut kalenderposter från Exchange-servern: Användarnamn, Lösenord och en E-postadress.

Lite beroende på hur miljön du ska koppla upp dig mot är konfigurerad så kan du komma att behöva ange länken till Exchange-servern själv (om autodiscovery inte är korrekt konfigurerat). Man kan även använda sig av impersonifiering om man känner för det (d.v.s. öppna en helt annan användares brevlåda), dock kräver detta att användaren man loggar in som har den rollen på Exchange-servern.

API:et använder en webbservice på Exchange servern för att kommunicera med Exchange, så i praktiken kan man säkerligen skriva om koden till valfritt språk om man har lust eller ork. Potentiellt finns det redan sådana projekt, det är dock inget jag känner till.

Om du vill använda API:et så finns det att ladda ner här.

Nedanstående kodsnutt borde hämta ut kalenderposter för den aktuella dagen (från 00:00 till 00:00 nästkommande dag) och maximalt 10 poster. Mer information om API:et som finns här.

using Microsoft.Exchange.WebServices.Data; using System; using System.Net; namespace MyApplication { class Program { static void Main(string[] args) { var service = new ExchangeService(); service.Credentials = new NetworkCredential("username@contoso.com", "MyPassword"); service.AutodiscoverUrl("user@contoso.com"); CalendarFolder calendar = CalendarFolder.Bind(service, WellKnownFolderName.Calendar, new PropertySet()); CalendarView view = new CalendarView(DateTime.Today, DateTime.Today.AddDays(1.0), 10); FindItemsResults<Appointment> appointments = calendar.FindAppointments(view); foreach (Appointment a in appointments) { Console.Write("Subject: " + a.Subject.ToString() + " "); Console.Write("Start: " + a.Start.ToString() + " "); Console.Write("End: " + a.End.ToString()); Console.WriteLine(); } } } }

Visa signatur

-- Citera mig om ni vill få återkoppling --

Permalänk
Medlem

En access token är inget som din administratör måste hjälpa dig med, utan det är något som inloggningsservern utfärdar åt dig när du loggat in.

Jag har själv ganska lite erfarenhet av just dessa, men jag vet att de är grunden till i princip all autensiering i Office 365.

Det finns utöver en access token även en refresh token (den har längre giltighetstid) och kan användas för att få en ny access token när den du hade har gått ut.

Jag har som sagt själv inte labbat särskilt mycket med detta, men jag har för mig att NuGet-paketet ADAL ska hantera hämtandet av access token, hämtande av ny access token baserat på en refresh token.

Det borde finns några exempel på hur man använder biblioteket för det du vill göra.

Visa signatur

-- Citera mig om ni vill få återkoppling --

Permalänk
Medlem

Använder ni lokal exchange isåfall 2007, 2010, 2013? eller är det office365?

Permalänk
Medlem

Tack alla för hjälpen! Har laborerat lite mer och läst lite här och där och kommit fram till detta:

using System; using Microsoft.Exchange.WebServices.Data; class Program { static void Main(string[] args) { ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2); service.UseDefaultCredentials = true; //service.Credentials = new WebCredentials("****@*****.com", "password"); service.AutodiscoverUrl("******@*****.com", RedirectionCallback); FolderId CalendarId = new FolderId(WellKnownFolderName.Calendar, "******@*******.com"); CalendarFolder calendar = CalendarFolder.Bind(service, CalendarId); CalendarView view = new CalendarView(DateTime.Today, DateTime.Today.AddDays(10.0), 10); FindItemsResults<Appointment> appointments = calendar.FindAppointments(view); foreach (Appointment a in appointments) { Console.Write("Subject: " + a.Subject.ToString() + " "); Console.Write("Start: " + a.Start.ToString() + " "); Console.Write("End: " + a.End.ToString()); Console.WriteLine(); } } static bool RedirectionCallback(string url) { // Return true if the URL is an HTTPS URL. return url.ToLower().StartsWith("https://"); } }

Jag hämtar ID't för rummets kalender och sedan var bara att lista alla bokade möten. Nu blir det till att köpa en Raspberry Pi och implementera detta

Visa signatur

Rigg: ASUS ROG Strix B660-I Gaming WIFI | i5 12400F | Corsair Vengence DDR5, 32 GB | nVidia Geforce GTX 1060 3GB | Samsung 980 PRO, 1 TB