Mi solución es esta:
Creé una cuenta de usuario que tiene acceso total a todos los buzones (puede otorgar esto a nivel del servidor).
Luego escribí un pequeño programa que se ejecuta con estos permisos, pero configurado de tal manera que el usuario que accede al programa no necesita la contraseña. Esto se realiza ejecutando el programa en un servidor web utilizando la suplantación.
Esto está en VB.NET / WebForms.
En web.config:
<identity impersonate="true" userName="domain\username" password="password" />
Luego hay una página ASP.NET realmente simple. En la aspx, tengo esto:
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="SetOOF._Default" AspCompat="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<p>
Username
<asp:TextBox ID="txtUsername" runat="server"></asp:TextBox>
<asp:Button ID="btnGetUser" runat="server" Text="Select" />
</p>
<p>
<asp:Label ID="lblUserName" runat="server"></asp:Label>
</p>
<p> <asp:CheckBox ID="chkOofEnabled" runat="server" /> Out of Office on/off
</p>
</div>
<p>
<asp:TextBox ID="txtOofText" runat="server" Height="217px" Width="479px"
TextMode="MultiLine"></asp:TextBox>
</p>
<p>
<asp:Button ID="btnUpdateUser" runat="server" Text="Update User" />
</p>
</form>
</body>
</html>
y en el archivo .vb, tengo
Imports MAPI
Partial Public Class _Default
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
End Sub
Protected Sub btnGetUser_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnGetUser.Click
Dim ses As MAPI.Session
ses = New MAPI.Session
ses = CreateObject("MAPI.Session")
ses.Logon(ShowDialog:=False, NoMail:=True, ProfileInfo:="mailserver" & vbLf & txtUsername.Text)
Dim user As MAPI.AddressEntry = ses.CurrentUser
lblUserName.Text = user.Name
chkOofEnabled.Checked = ses.OutOfOffice
txtOofText.Text = ses.OutOfOfficeText
ses.Logoff()
End Sub
Protected Sub btnUpdateUser_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnUpdateUser.Click
Dim ses As New MAPI.Session
ses = CreateObject("MAPI.Session")
ses.Logon(ShowDialog:=False, NoMail:=True, ProfileInfo:="mailserver" & vbLf & txtUsername.Text)
ses.OutOfOffice = chkOofEnabled.Checked
ses.OutOfOfficeText = txtOofText.Text
ses.Logoff()
End Sub
End Class
Tenga en cuenta que necesitará tener Outlook instalado en el servidor web en el que ejecuta esto, ya que usa MAPI para conectarse al servidor de correo (también necesita una referencia a nivel de proyecto para la Biblioteca de CDO de Microsoft, que es MAPI). Mientras sea una sola organización de Exchange, no importa qué servidor de correo: Exchange redirigirá la aplicación al servidor correcto.
Puede usar la sección de su web.config para restringir el acceso a la aplicación a su mesa de ayuda y administradores de sistemas para que los usuarios comunes no puedan acceder a la aplicación por sí mismos.