Lync Inband Provisioning

Wenn sich ein Client per SIP am Server anmeldet, dann bekommt dieser als Antwort auf den SUBSCRIBE auch eine etwas größere Datenstruktur, die die Einstellungen für den Client vorgeben. Diese Daten gibt es einmal für den normalen Lync Client aber auch für die Konferenz-Funktion. Und sogar Telefone bekommen über diesen Weg ihre Einstellungen. Ich möchte nicht auf die einzelnen Parameter eingehen aber der Request alleine ist schon ein schönes Beispiel um zu sehen, was da alles kommt.

Das Provisioning-Paket können Sie auf dem Server über den Logger als auch auf dem Client bei aktivierter Protokollierung einsehen.

Die Zeiten der Konfiguration per Gruppenrichtlinien sind mit Lync vorbei. Schade dass Outlook noch kein "Inband Provisioning" unterstützt. Nur ActiveSync-Geräte haben einen ähnlichen Mechanismus.

Quellen und Reihenfolge

Lync Clients können über verschiedene Wege konfiguriert werden. Lokale Einstellungen, Gruppenrichtlinien und Inband-Provisioning konfigurieren den Client. Wenn sie aber Einstellungen vielleicht noch konkurrierend einstellen, dann ist die Reihenfolge wichtig, in der der Client die Einstellungen übernimmt. Sobald eine Einstellung gefunden ist, wird diese Einstellung nicht mehr weiter gesucht.

Quelle Beschreibung Prio

HKEY_LOCAL_MACHINE\Software\Microsoft\ Communicator

 

1

HKEY_CURRENT_User\Software\Microsoft\ Communicator

 

2

HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\ Communicator

 

3

HKEY_CURRENT_User\Software\Policies\Microsoft\ Communicator

 

4

SIP Inband

 

5

Interessant ist hierbei, dass SIP-Inband am Ende steht. Allerdings gibt es Einstellungen, die der Communicator nur per Inband ausliest. Sie werden z.B. in der lokalen Registrierung keinen Dialplan, Normalisierungsregeln etc. konfigurieren können, weil es diese Einstellungen einfach nicht gibt.

Nur ganz wegen Einstellungen, die den Communicator selbst betreffen, können auch über Gruppenrichtlinien gesetzt werden

Desktopeinstellungen

Die Provisioning-Antwort ist eine direkte 200 SIP OK-Meldung, die eine erfolgreiche Registrierung quittiert. Hierein Beispiel:

SIP/2.0 200 OK
Contact: <sip:NAWLYNC001.msxfaq.de:5061;transport=tls;received=192.168.100.100;ms-received-cid=1D86203>
Content-Length: 51294
From: "Carius, Frank"<sip:User1@msxfaq.de>;tag=690a845fec;epid=110531d8e4
To: <sip:User1@msxfaq.de>;tag=1C4A0080
Call-ID: c15bfa31692d4495903e2f1cbea403bd
CSeq: 1 SUBSCRIBE
Via: SIP/2.0/TLS 2.206.238.206:5526;ms-received-port=5526;ms-received-cid=1DB6C00
Expires: 0
Content-Type: application/vnd-microsoft-roaming-provisioning-v2+xml
Event: vnd-microsoft-provisioning-v2
subscription-state: terminated;expires=0
ms-piggyback-cseq: 1
Supported: ms-piggyback-first-notify

<provisionGroupList xmlns="http://schemas.microsoft.com/2006/09/sip/provisiongrouplist-notification">
<provisionGroup name="endpointConfiguration" >
<propertyEntryList >
  <property name="ShowRecentContacts" >true</property>
  <property name="ShowManagePrivacyRelationships" >false</property>
  <property name="MaxPhotoSizeKB" >30</property>
  <property name="DisableMusicOnHold" >false</property>
  <property name="MusicOnHoldAudioFile" >\\lync01\Ansagen\03_Warteschleife_mono.wma</property>
  <property name="PhotoUsage" >AllPhotos</property>
  <property name="AbsUsage" >WebSearchAndFileDownload</property>
  <property name="HotdeskingTimeout" >300</property>
  <property name="SPSearchInternalURL" >https://intranet.msxfaq.de/_vti_bin/search.asmx</property>
  <property name="SPSearchExternalURL" >https://intranet.msxfaq.de/_vti_bin/search.asmx</property>
  <property name="SPSearchCenterInternalURL" >https://intranet.msxfaq.de/Suche/Seiten/peopleresults.aspx</property>
  <property name="SPSearchCenterExternalURL" >https://intranet.msxfaq.de/Suche/Seiten/peopleresults.aspx</property>
  <property name="EnableExchangeDelegateSyncUp" >true</property>
  <property name="EnableContactSync" >true</property>
  <property name="ShowSharepointPhotoEditLink" >false</property>
  <property name="EnableVOIPCallDefault" >false</property>
  <property name="MaximumDGsAllowedInContactList" >10</property>
  <property name="P2PAppSharingEncryption" >0</property>
</propertyEntryList>
</provisionGroup>
<provisionGroup name="locationPolicy" >
<propertyEntryList >
  <property name="EnhancedEmergencyServicesEnabled" >false</property>
  <property name="LocationPolicyTagID" >User-tagid</property>
  <property name="LocationRequired" >yes</property>
  <property name="UseLocationForE911Only" >false</property>
</propertyEntryList>
</provisionGroup>
<provisionGroup name="mediaConfiguration" >
<propertyEntryList >
  <property name="bypassEnabled" >true</property>
  <property name="internalBypassMode" >Any</property>
  <property name="externalBypassMode" >Off</property>
  <property name="bypassId" >9adbd0b2-866b-4d8c-9b97-e44f05ee61bb</property>
</propertyEntryList>
</provisionGroup>
<provisionGroup name="meetingPolicy" >
<instance >
  <property name="AllowIPAudio" >true</property>
  <property name="AllowIPVideo" >true</property>
  <property name="EnableAppDesktopSharing" >true</property>
  <property name="AllowAppSharingForExternalMeeting" >Desktop</property>
  <property name="RetainPPTForExternalMeeting" >true</property>
  <property name="AllowPresenterToRecord" >true</property>
  <property name="EnableDataCollaboration" >true</property>
  <property name="MeetingSize" >100</property>
  <property name="EnablePSTNConferencing" >true</property>
  <property name="TrustedConferencingPinRequired" >false</property>
  <property name="AllowParticipantControl" >true</property>
  <property name="AllowAnnotations" >true</property>
  <property name="AllowAnonymousParticipants" >true</property>
  <property name="AllowExternalUserControl" >true</property>
  <property name="AllowExternalUsersToSaveContent" >true</property>
  <property name="AllowExternalUserRecording" >false</property>
  <property name="AllowPolls" >true</property>
  <property name="AllowRecording" >true</property>
  <property name="EnableP2PRecording" >false</property>
  <property name="AllowFileTransfer" >true</property>
  <property name="MaxConferenceVideoResolution" >VGA</property>
  <property name="AllowUserToScheduleMeetingsWithAppSharing" >true</property>
  <property name="EnableP2PFileTransfer" >true</property>
  <property name="AllowedAppDesktopSharingLevel" >Desktop</property>
  <property name="AudioBitRate" >200</property>
  <property name="VideoBitRate" >50000</property>
  <property name="AppSharingBitRate" >50000</property>
  <property name="FileTransferBitRate" >50000</property>
  <property name="EnableP2PVideo" >true</property>
</instance>
</provisionGroup>
<provisionGroup name="presencePolicyV2" >
<propertyEntryList >
  <property name="EnablePrivacyMode" >false</property>
  <property name="AutoInitiateContacts" >true</property>
  <property name="PublishLocationDataDefault" >true</property>
  <property name="DisplayPublishedPhotoDefault" >true</property>
  <property name="PersonalNoteHistoryDepth" >3</property>
  <property name="SubscribeToCollapsedDG" >true</property>
</propertyEntryList>
</provisionGroup>
<provisionGroup name="privacyPublicationGrammar" >
<containerManifestList     xxxxxxDeletedxxxx </containerManifestList> </provisionGroup>
<provisionGroup name="publicationGrammar" >
<containerManifestList     xxxxxxDeletedxxxx </containerManifestList> </provisionGroup>
<provisionGroup name="ServerConfiguration" >
<absWebServiceEnabled>true</absWebServiceEnabled>
<lisInternalURL>https://lync01.msxfaq.de:443/locationinformation/liservice.svc</lisInternalURL>
<absInternalServerURL>https://lync01.msxfaq.de:443/abs/handler</absInternalServerURL>
<absExternalServerURL>https://lyncweb.msxfaq.de:443/abs/handler</absExternalServerURL>
<abwqInternalURL>https://lync01.msxfaq.de:443/groupexpansion/service.svc</abwqInternalURL>
<abwqExternalURL>https://lyncweb.msxfaq.de:443/groupexpansion/service.svc</abwqExternalURL>
<dlxInternalURL>https://lync01.msxfaq.de:443/groupexpansion/service.svc</dlxInternalURL>
<dlxExternalURL>https://lyncweb.msxfaq.de:443/groupexpansion/service.svc</dlxExternalURL>
<dlxEnabled>true</dlxEnabled>
<UpdatesServerInternalURL>https://lync01.msxfaq.de:443/RequestHandler/ucdevice.upx</UpdatesServerInternalURL>
<UpdatesServerExternalURL>https://lyncweb.msxfaq.de:443/RequestHandlerExt/ucdevice.upx</UpdatesServerExternalURL>
<UpdatesServerEnabled>true</UpdatesServerEnabled>
<ucPortRangeEnabled>false</ucPortRangeEnabled>
<ucMinMediaPort>5350</ucMinMediaPort>
<ucMaxMediaPort>5389</ucMaxMediaPort>
<ucMinSipDynamicPort>7100</ucMinSipDynamicPort>
<ucMaxSipDynamicPort>7102</ucMaxSipDynamicPort>
<ucMinAudioPort>5350</ucMinAudioPort>
<ucMaxAudioPort>5389</ucMaxAudioPort>
<ucMinVideoPort>5350</ucMinVideoPort>
<ucMaxVideoPort>5389</ucMaxVideoPort>
<ucMinAppSharingPort>5350</ucMinAppSharingPort>
<ucMaxAppSharingPort>5389</ucMaxAppSharingPort>
<ucMinFileTransferPort>5350</ucMinFileTransferPort>
<ucMaxFileTransferPort>5389</ucMaxFileTransferPort>
<ucPC2PCAVEncryption>SupportEncryption</ucPC2PCAVEncryption>
<ucMaxVideoRateAllowed>Hd720p-1.5M</ucMaxVideoRateAllowed>
<qosEnabled>false</qosEnabled>
<ucDiffServVoice>40</ucDiffServVoice>
<ucVoice802_1p>0</ucVoice802_1p>
<UCEnforcePinLock>false</UCEnforcePinLock>
<ucMinPinLength>6</ucMinPinLength>
<ucPhoneTimeOut>10</ucPhoneTimeOut>
<UCExchangeMWIPoll>3</UCExchangeMWIPoll>
<UCEnableSIPSecurityMode>High</UCEnableSIPSecurityMode>
<UCEnableUserLogging>false</UCEnableUserLogging>
<loggingLevel>Off</loggingLevel>
<enableBWPolicyCheck>false</enableBWPolicyCheck>
<poolUri>sip:lync01.msxfaq.de@msxfaq.de;gruu;opaque=srvr:HomeServer:xJwxxxxxMdwAA</poolUri>
<mrasUri>sip:nawlyncedge.msxfaq.de@msxfaq.de;gruu;opaque=srvr:MRAS:b-l67axxxxxxxxxM9QPixAAA</mrasUri>
<qosUri>sip:lync01.msxfaq.de@msxfaq.de;gruu;opaque=srvr:HomeServer:xJwxxxxxMdwAA</qosUri>
<callParkServerUri>sip:lync01.msxfaq.de@msxfaq.de;gruu;opaque=srvr:Microsoft.Rtc.Applications.Cps:N8xxxxOC1gwAA</callParkServerUri>
<responseGroupServiceInternalURL>https://lync01.msxfaq.de:443/RgsClients/AgentService.svc</responseGroupServiceInternalURL>
<responseGroupServiceExternalURL>https://lyncweb.msxfaq.de:443/RgsClients/AgentService.svc</responseGroupServiceExternalURL>
<responseGroupServiceInternalAgentURL>https://lync01.msxfaq.de:443/RgsClients/Tab.aspx</responseGroupServiceInternalAgentURL>
<responseGroupServiceExternalAgentURL>https://lyncweb.msxfaq.de:443/RgsClients/Tab.aspx</responseGroupServiceExternalAgentURL>
<botSipUriForTestCall>sip:lync01.msxfaq.de@msxfaq.de;gruu;opaque=srvr:Microsoft.Rtc.Applications.TestBot:yxGAxxxxxjS6gAA</botSipUriForTestCall>
<cwaInternalUri>https://meet.msxfaq.de/dialin</cwaInternalUri>
<cwaExternalUri>https://meet.msxfaq.de/dialin</cwaExternalUri>
<ucLocationProfile>Paderborn.msxfaq.de</ucLocationProfile>
<focusFactoryUri>sip:User1@msxfaq.de;gruu;opaque=app:conf:focusfactory</focusFactoryUri>
<voiceMailUri>sip:User1@msxfaq.de;opaque=app:voicemail</voiceMailUri></provisionGroup>
<provisionGroup name="ucPolicy" >
<instance >
<property name="name" >Default Policy</property>
<property name="AllowSimultaneousRinging" >true</property>
<property name="AllowCallForwarding" >true</property>
<property name="EnableDelegation" >true</property>
<property name="EnableTeamCall" >true</property>
<property name="EnableCallPark" >true</property>
<property name="EnableCallTransfer" >true</property>
<property name="EnableMaliciousCallTrace" >false</property>
<property name="enableBWPolicyOverride" >false</property>
<property name="UCEnabled" >true</property>
</instance>
</provisionGroup>
<provisionGroup name="UserSetting" >
<disableFileTransfer>false</disableFileTransfer>
<ucUserLocationProfile>Paderborn.msxfaq.de</ucUserLocationProfile>
</provisionGroup>
</provisionGroupList>

Sie sehen also sehr umfangreich die komplette Clientvorgabe.

Media Relay

In einem getrennten Request werden dann die Relay-Einstellungen mit den Daten des Edge-Servers geliefert

02/17/2015|19:53:20.552 1D08:1D0C INFO  :: SIP/2.0 200 OK
CSEQ: 1 SERVICE

CONTENT-LENGTH: 1019
CONTENT-TYPE: application/msrtc-media-relay-auth+xml
SERVER: RTCC/6.0.0.0 MRAS/3.0

<?xml version="1.0"?>
<response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" requestID="841745152" version="3.0" serverVersion="3.0" to="sip:sipedgeSN20A.infra.lync.com@online.lync.com;gruu;opaque=srvr:MRAS:HOVwnJC_g1WS-euJvmbl7QAA" from="sip:nawdemo365b@netatwork.de" reasonPhrase="OK" xmlns="http://schemas.microsoft.com/2006/09/sip/mrasp">
  <credentialsResponse credentialsRequestID="841745152">
    <credentials>
      <username>xxx+xxx//xxx==</username>
      <password>xxxx=</password>
      <duration>480</duration>
    </credentials>
    <mediaRelayList>
      <mediaRelay>
        <location>internet</location>
        <hostName>mediaedge0A.online.lync.com</hostName>
        <udpPort>3478</udpPort>
        <tcpPort>443</tcpPort>
      </mediaRelay>
    </mediaRelayList>
  </credentialsResponse>
s</response>

Sie sehen hier die Zugangsdaten in Form von Username/password, die eine bestimmte Zeit gültig sind und der Client ist wohl extern, so dass ich als Location ein "Internet" bekomme und der Hostname des Media-Relay dann über das Internet auflösbar sein muss. Auch die Ports für UDP (3478) und TCP (443) sind ja nicht unbekannt

Konferenzeinstellungen

Auch die für den Anwender verfügbaren Konferenzeinstellungen sind in einem SIP 200 OK enthalten, der aber eine Antwort auf einen "Service"-Request ist und nicht auf einen Register kommt.

SIP/2.0 200 OK
Content-Length: 2170
From: "Carius, Frank"<sip:User1@msxfaq.de>;tag=c42fcb1ac4;epid=110531d8e4
To: <sip:User1@msxfaq.de;gruu;opaque=app:conf:focusfactory>;tag=ADB630276E90FD30E742440D1C2AA84C
Call-ID: c161cd50b4114d9e93edcd2c14b7ad87
CSeq: 1 SERVICE
Content-Type: application/cccp+xml

<response xmlns="urn:ietf:params:xml:ns:cccp" 
   xmlns:mscp="http://schemas.microsoft.com/rtc/2005/08/cccpextensions" 
   xmlns:msci="http://schemas.microsoft.com/rtc/2005/08/confinfoextensions" 
   xmlns:msci2="http://schemas.microsoft.com/rtc/2008/12/confinfoextensions" 
   xmlns:cis="urn:ietf:params:xml:ns:conference-info-separator" 
   requestId="4229968" C3PVersion="1" 
   from="sip:User1@msxfaq.de;gruu;opaque=app:conf:focusfactory" 
   to="sip:User1@msxfaq.de" code="success">
<getConferencingCapabilities capability-version="0">
  <mcu-types>
    <mcuType>applicationsharing</mcuType>
    <mcuType>audio-video</mcuType>
    <mcuType>data-conf</mcuType>
    <mcuType>chat</mcuType>
  </mcu-types>
  <pstn-bridging>
    <enabled>true</enabled>
    <access-numbers>
      <msci:internal-URL>https://meet.msxfaq.de/dialin</msci:internal-URL>
      <msci:external-URL>https://meet.msxfaq.de/dialin</msci:external-URL>
      <msci:region name="NetatWork Paderborn, DE">
        <msci:access-number>
          <msci:language tag="de-DE" lcid="1031"/>
          <msci:language tag="fr-FR" lcid="1036"/>
          <msci:language tag="en-US" lcid="1033"/>
          <msci:number>+49 5251 304 699</msci:number>
        </msci:access-number>
      </msci:region>
    <msci2:default-region>Paderborn, DE</msci2:default-region>
    </access-numbers>
  </pstn-bridging>
  <conference-key-optional>true</conference-key-optional>
  <anonymous-scheduling>true</anonymous-scheduling>
  <default-admission-policy>anonymous</default-admission-policy>
  <cis:separator/>
  <mscp:schedule-locked>true</mscp:schedule-locked>
  <msci:autopromote-allowed>2147516416</msci:autopromote-allowed>
  <mscp:default-autopromote>32768</mscp:default-autopromote>
  <msci:pstn-lobby-bypass-allowed>true</msci:pstn-lobby-bypass-allowed>
  <mscp:static-meeting-limit>1</mscp:static-meeting-limit>
  <mscp:default-meeting-static>true</mscp:default-meeting-static>
  <msci:recording-allowed>true</msci:recording-allowed>
  <msci:externalUser-recording-allowed>false</msci:externalUser-recording-allowed>
  <mscp:schedule-key-optional>true</mscp:schedule-key-optional>
  <msci:default-entry-exit-Announcements>false</msci:default-entry-exit-Announcements>
  </getConferencingCapabilities>
</response>

Auch hier sind nicht nur die "Simple-URLs" sichtbar, sondern auch alle "Berechtigungen", die der Anwender hat, z.B. anonyme Teilnehmer erlaubt sind etc.

Telefoneinstellungen

Ein Lync Telefon bekommt über den Weg auch seine Konfigurationsdaten. Zwar können auch Lync Telefone ein Protokoll schreiben und hochladen, aber die Auswertung ist schon mühseliger, so dass hier das Mitschneiden auf dem Lync Server der geeignetere Weg ist. Ein Mitschnitt per Netmon ist aufgrund der TLS-Verschlüsselung nicht sinnvoll. 

<provisionGroup name="ucPolicy" >
  <instance >
    <property name="name" >Default Policy</property>
    <property name="AllowSimultaneousRinging" >true</property>
    <property name="AllowCallForwarding" >true</property>
    <property name="EnableDelegation" >true</property>
    <property name="EnableTeamCall" >true</property>
    <property name="EnableCallPark" >true</property>
    <property name="EnableCallTransfer" >true</property>
    <property name="EnableMaliciousCallTrace" >false</property>
    <property name="enableBWPolicyOverride" >false</property>
    <property name="UCEnabled" >true</property>
  </instance>
</provisionGroup>

Weitere Links