영구 채팅 서버에 대한 준수 서비스 구성

Skype for Business Server 2015
 

마지막으로 수정된 항목: 2016-03-28

요약: 이 항목에서는 영구 채팅 서버 준수 서비스를 구성하는 방법에 대해 설명합니다.

영구 채팅 준수를 통해 관리자는 영구 채팅 메시지뿐 아니라 작업의 보관 파일도 유지 관리할 수 있습니다. 준수 서비스는 참가자가 다음을 수행하는 경우를 포함하여 각 영구 채팅 서버 대화와 관련된 데이터를 기록하고 보관합니다.

  • 영구 채팅방에 입장

  • 채팅방에서 나가기

  • 메시지 게시

  • 채팅 기록 보기

  • 파일 업로드

  • 파일 다운로드

이 정보는 필요에 따라 준수 SQL 데이터베이스에서 검색할 수 있습니다.

토폴로지 작성기를 사용해 준수 서비스를 사용하도록 설정한 후 Set-CsPersistenChatComplianceConfiguration cmdlet을 사용하여 서비스를 구성할 수 있습니다.

Set-CsPersistentChatComplianceConfiguration [-Identity <XdsIdentity>] <COMMON PARAMETERS>

또는

Set-CsPersistentChatComplianceConfiguration [-Instance <PSObject>] <COMMON PARAMETERS>

다음 매개 변수를 설정할 수 있습니다.

  • AdapterType - 어댑터 유형을 지정할 수 있습니다. 어댑터는 준수 데이터베이스의 데이터를 특정 형식으로 변환하는 타사 제품입니다. XML이 기본값입니다.

  • OneChatRoomPerOutputFile - 이 매개 변수를 사용하면 각 채팅방에 대해 별도의 보고서를 만들도록 지정할 수 있습니다.

  • AddChatRoomDetails - 사용하도록 설정된 경우 이 매개 변수는 각 채팅방에 대한 추가 세부 정보를 데이터베이스에 기록합니다. 이 경우 데이터베이스 크기가 상당히 늘어날 수 있으므로 이 설정은 기본적으로 사용하지 않도록 설정되어 있습니다.

  • AddUserDetails - 사용하도록 설정된 경우 이 매개 변수는 각 채팅방 사용자에 대한 추가 세부 정보를 데이터베이스에 기록합니다. 이 경우 데이터베이스 크기가 상당히 늘어날 수 있으므로 이 설정은 기본적으로 사용하지 않도록 설정되어 있습니다.

  • Identity - 이 매개 변수를 사용하면 준수 설정을 통해 특정 컬렉션의 범위가 전역, 사이트, 서비스 수준 등으로 지정될 수 있습니다. 기본값은 전역 수준입니다.

  • RunInterval - 이 매개 변수는 서버에서 다음 준수 출력 파일을 만들기 전의 시간(기본값: 15분)을 기술합니다.

영구 채팅 서버와 함께 설치되는 XmlAdapter를 사용하는 대신 사용자 지정 어댑터를 작성할 수 있습니다. 이렇게 하려면 IComplianceAdapter 인터페이스를 구현하는 공용 클래스가 포함된 .NET Framework 어셈블리를 제공해야 합니다. 이 어셈블리는 영구 채팅 서버 풀에 포함된 각 서버의 영구 채팅 서버 설치 폴더에 저장해야 합니다. 준수 서버 중 하나가 어댑터에 준수 데이터를 제공할 수 있지만, 준수 서버가 여러 어댑터 인스턴스에 대해 중복 준수 데이터를 제공하지는 않습니다.

인터페이스는 Compliance.dll 어셈블리의 Microsoft.Rtc.Internal.Chat.Server.Compliance 네임스페이스에 정의됩니다. 이 인터페이스는 사용자 지정 어댑터가 구현해야 하는 두 개의 메서드를 정의합니다.

영구 채팅 준수 서버는 어댑터를 처음 로드할 때 다음 메서드를 호출합니다. AdapterConfig에는 준수 어댑터와 관련된 영구 채팅 준수 구성이 포함됩니다.

void SetConfig(AdapterConfig config)

영구 채팅 준수 서버는 변환할 새 데이터가 있으면 일정한 간격으로 다음 메서드를 호출합니다. 이 시간 간격은 영구 채팅 준수 구성에 설정된 RunInterval과 동일합니다.

void Translate(ConversationCollection conversations)

ConversationCollection에는 이 메서드를 마지막으로 호출한 시간 이후 수집된 대화 정보가 포함됩니다.

준수 데이터는 XSLT 정의 파일을 사용하여 조직에 가장 적합한 형식으로 변환할 수 있는 XML로 전달됩니다. 이 항목에서는 준수 서비스가 만드는 XML 파일에 대해 설명합니다. 또한 XSLT 정의 및 출력 파일의 샘플을 제공합니다.

준수 서비스 출력은 다음 코드 샘플에 나와 있는 것처럼 대화(Conversation 요소)로 분류된 후 메시지(Messages 요소)로 분류됩니다.

<?xml version="1.0" encoding="utf-8" ?> 
<Conversations>
  <Conversation>
    <Channel uri="ma-chan://litwareinc.com/300" name="ma-chan://litwareinc.com/300" islogged="" /> 
    <!--FirstMessage goes here --!>
    <Messages> 
      <!—Messages go here--!>
    </Messages>
    <StartTimeUTC since1970="1212610540953" string="2008-06-04T20:15:40.9535482Z" long="633482073409535482" /> 
    <EndTimeUTC since1970="1212610602532" string="2008-06-04T20:16:42.5324614Z" long="633482074025324614" /> 
  </Conversation>
</Conversations>

Conversation 요소에는 Channel, FirstMessage, StartTimeUTC, EndTimeUTC 등 네 가지 요소가 포함됩니다. Channel 요소에는 채팅방의 URI(Uniform Resource Identifier)가 포함되며 FirstMessage 요소는 Messages 요소의 첫 번째 메시지를 기술합니다. StartTimeUTC 및 EndTimeUTC 요소는 다음 코드 샘플에 나와 있는 것처럼 대화의 시작 및 종료 시간을 제공합니다.

<<FirstMessage type="JOIN" content="" id="0">
      <Sender UserName="TestUser kazuto" id="10" email="kazuto@litwareinc.com" internal="true" uri="kazuto@litwareinc.com" /> 
      <DateTimeUTC since1970="1212610540953" string="2008-06-04T20:15:40.9535482Z" long="633482073409535482" /> 
</FirstMessage>

Message 요소에는 Sender 및 DateTimeUTC 등 두 가지 요소와 Type, Content, ID 등 세 가지 특성이 포함됩니다. Sender 요소는 메시지를 전송한 사용자를 나타내며, DateTimeUTC 요소는 다음 코드 샘플에 나와 있는 것처럼 이벤트가 발생한 시간을 나타냅니다.

<Message type="JOIN" content="" id="0">
  <Sender UserName="TestUser kazuto" id="10" email="kazuto@litwareinc.com" internal="true" uri="kazuto@litwareinc.com" /> 
  <DateTimeUTC since1970="1206211842612" string="2008-03-22T18:50:42.6127374Z" long="633418086426127374" /> 
</Message>

다음 표에서는 메시지 특성인 Type, Content, ID에 대해 설명합니다.

Messages 요소 특성

특성설명선택/필수

Type

메시지 유형을 지정합니다. 메시지 유형은 Message 요소 메시지 유형 테이블에서 설명합니다.

필수

Content

메시지의 콘텐츠가 포함되어 있습니다. 유형이 Join 또는 Part인 메시지는 이 특성을 사용하지 않습니다.

선택

ID

콘텐츠의 고유한 ID를 지정합니다. 이 특성은 유형이 Chat인 메시지에만 사용됩니다.

선택

각 Sender 요소에는 UserName, ID, Email, Internal, URI 등 5가지 특성이 포함됩니다. 이러한 특성은 다음 표에서 설명합니다.

Sender 요소 특성

특성설명선택/필수

Username

보낸 사람의 이름입니다.

선택

ID

보낸 사람의 고유한 ID입니다.

필수

Email

보낸 사람의 전자 메일 주소입니다.

선택

Internal

사용자가 내부 사용자 또는 페더레이션 사용자인지를 확인합니다. 값이 True로 설정된 경우 사용자가 내부 사용자입니다.

선택

Uri

사용자의 SIP URI입니다.

필수

다음 표에서는 Messages 요소가 포함할 수 있는 메시지 유형에 대해 설명합니다. 또한 각 요소가 사용되는 방법에 대한 예도 보여 줍니다.

Message 요소 메시지 유형

메시지 유형설명코드 예제

Join

사용자가 채팅방에 참가합니다.

<Message type="JOIN" content="" id="0">
  <Sender UserName="TestUser kazuto" id="10" email="kazuto@litwareinc.com" internal="true" uri="kazuto@litwareinc.com" /> 
  <DateTimeUTC since1970="1206211842612" string="2008-03-22T18:50:42.6127374Z" long="633418086426127374" /> 
</Message

Part

사용자가 채팅방에서 나갑니다.

<Message type="PART" content="" id="0">
  < Sender UserName="TestUser kazuto" id="10" email="kazuto@litwareinc.com" internal="true" uri="kazuto@litwareinc.com" /> 
  <DateTimeUTC since1970="1212610602532" string="2008-06-04T20:16:42.5324614Z" long="633482074025324614" /> 
</Message>

Chat

보낸 사람의 전자 메일 주소입니다.

<Message type="CHAT" content="hello" id="1">
  <Sender UserName="TestUser kazuto" id="10" email="kazuto@litwareinc.com" internal="true" uri="kazuto@litwareinc.com" /> 
  <DateTimeUTC since1970="1205351800522" string="2008-03-12T19:56:40.522264Z" long="633409486005222640" /> 
</Message>

Backchat

사용자가 대화 기록의 콘텐츠를 요청합니다.

<Message type="BACKCHAT" content="backchatcontent" id="0">
  <Sender UserName="TestUser kazuto" id="10" email="kazuto@litwareinc.com" internal="true" uri="kazuto@litwareinc.com" /> 
  <DateTimeUTC since1970="1206034385284" string="2008-03-20T17:33:05.2841594Z" long="633416311852841594" /> 
</Message>

File upload

사용자가 파일을 업로드합니다.

<Message type="FILEUPLOAD" content="0988239a-bb66-4616-90a4-b07771a2097c.txt" id="0">
  <Sender UserName="TestUser kazuto" id="10" email="kazuto@litwareinc.com" internal="true" uri="kazuto@litwareinc.com" /> 
  <DateTimeUTC since1970="1205351828975" string="2008-03-12T19:57:08.9755711Z" long="633409486289755711" /> 
</Message>

File download

사용자가 파일을 다운로드합니다.

<Message type="FILEDOWNLOAD" content="006074ca-24f0-4b35-8bd8-98006a2d1aa8.txt" id="0">
  <Sender UserName="kazuto@litwareinc.com" id="10" email="" internal="true" uri="kazuto@litwareinc.com" /> 
  <DateTimeUTC since1970="1212611141851" string="2008-06-04T20:25:41.8518646Z" long="633482079418518646" /> 
</Message>

다음 코드 샘플에는 준수 서버의 기본 출력이 포함되어 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Conversations" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
   <xs:simpleType name="ComplianceMessageType">
      <xs:restriction base="xs:string">
        <xs:enumeration value="JOIN"/>
        <xs:enumeration value="PART"/>
        <xs:enumeration value="CHAT"/>
        <xs:enumeration value="BACKCHAT"/>
        <xs:enumeration value="FILEUPLOAD"/>
        <xs:enumeration value="FILEDOWNLOAD"/>
      </xs:restriction>
    </xs:simpleType>
  
  <xs:element name="Sender">
    <xs:complexType>
      <xs:attribute name="UserName" type="xs:string" />
      <xs:attribute name="id" type="xs:int" />
      <xs:attribute name="email" type="xs:string" use="optional" />
      <xs:attribute name="internal" type="xs:boolean" use="optional" >
        <xs:annotation><xs:documentation>If the user is internal or federated</xs:documentation></xs:annotation>
      </xs:attribute>
      <xs:attribute name="uri" type="xs:anyURI" use="optional" />
    </xs:complexType>
  </xs:element>
  <xs:element name="DateTimeUTC">
    <xs:complexType>
      <xs:attribute name="since1970" type="xs:long" />
      <xs:attribute name="string" type="xs:string" />
      <xs:attribute name="long" type="xs:long" />
    </xs:complexType>
  </xs:element>
  <xs:element name="Conversations" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="Sender" />
        <xs:element ref="DateTimeUTC" />
        <xs:element name="Conversation">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Channel" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:attribute name="uri" type="xs:anyURI" />
                  <xs:attribute name="name" type="xs:string" use="optional" />
                </xs:complexType>
              </xs:element>
              <xs:element name="FirstMessage" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element ref="Sender" minOccurs="0" maxOccurs="unbounded" />
                    <xs:element ref="DateTimeUTC" minOccurs="0" maxOccurs="unbounded" />
                  </xs:sequence>
                  <xs:attribute name="type" type="ComplianceMessageType" />
                  <xs:attribute name="content" type="xs:string" />
                  <xs:attribute name="id" type="xs:int" />
                </xs:complexType>
              </xs:element>
              <xs:element name="Messages" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Message" minOccurs="0" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element ref="Sender" minOccurs="0" maxOccurs="unbounded" />
                          <xs:element ref="DateTimeUTC" minOccurs="0" maxOccurs="unbounded" />
                        </xs:sequence>
                        <xs:attribute name="type" type="ComplianceMessageType" />
                        <xs:attribute name="content" type="xs:string" />
                        <xs:attribute name="id" type="xs:int" />
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="StartTimeUTC" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:attribute name="since1970" type="xs:long" />
                  <xs:attribute name="string" type="xs:string" />
                  <xs:attribute name="long" type="xs:long" />
                </xs:complexType>
              </xs:element>
              <xs:element name="EndTimeUTC" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:attribute name="since1970" type="xs:long" />
                  <xs:attribute name="string" type="xs:string" />
                  <xs:attribute name="long" type="xs:long" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

다음 코드 샘플에는 샘플 XSL 변환이 포함되어 있습니다.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
   <xsl:output method="xml" encoding="UTF-8" indent="yes" />

   <xsl:template match="/">
      <FileDump>
         <xsl:apply-templates />
      </FileDump>
   </xsl:template>

   <xsl:template match="Conversation">
      <xsl:variable name="chanName" select="Channel/@name" />
      <Conversation Perspective="{$chanName}_group_channel">
         <RoomID><xsl:value-of select="Channel/@name" /></RoomID>
         <StartTimeUTC><xsl:value-of select="StartTimeUTC/@since1970" /></StartTimeUTC>
         <xsl:apply-templates />
         <EndTimeUTC><xsl:value-of select="EndTimeUTC/@since1970" /></EndTimeUTC>
      </Conversation>
   </xsl:template>

   <xsl:template match="Message">
      <xsl:choose>
         <xsl:when test="@type='JOIN'">
            <ParticipantEntered>
               <xsl:call-template name="DateTimeAndLogin" />
               <InternalFlag><xsl:value-of select="Sender/@internal" /></InternalFlag>
               <ConversationID><xsl:value-of select="../../Channel/@name" /></ConversationID>
               <CorporateEmailID><xsl:value-of select="Sender/@email" /></CorporateEmailID>
            </ParticipantEntered>
         </xsl:when>

         <xsl:when test="@type='PART'">
            <ParticipantLeft>
               <xsl:call-template name="DateTimeAndLogin" />
               <InternalFlag><xsl:value-of select="Sender/@internal" /></InternalFlag>
               <ConversationID><xsl:value-of select="../../Channel/@name" /></ConversationID>
               <CorporateEmailID><xsl:value-of select="Sender/@email" /></CorporateEmailID>
            </ParticipantLeft>
         </xsl:when>

         <xsl:when test="@type='FILEUPLOAD' or @type='FILEDOWNLOAD'">
            <FileTransferStarted>
               <xsl:call-template name="DateTimeAndLogin" />
               <FileName><xsl:value-of select="@content" /></FileName>
            </FileTransferStarted>
            <FileTransferEnded>
               <xsl:call-template name="DateTimeAndLogin" />
               <FileName><xsl:value-of select="@content" /></FileName>
               <Status>Completed</Status>
            </FileTransferEnded>
         </xsl:when>

         <xsl:when test="@type='CHAT' or @type='BACKCHAT'">
            <Message>
               <xsl:call-template name="DateTimeAndLogin" />
               <Content><xsl:value-of select="@content" /></Content>
            </Message>
         </xsl:when>

         <xsl:otherwise />
      </xsl:choose>
   </xsl:template>

   <xsl:template name="DateTimeAndLogin">
      <LoginName><xsl:value-of select="Sender/@userName" /></LoginName>
      <DateTimeUTC><xsl:value-of select="DateTimeUTC/@since1970" /></DateTimeUTC>
   </xsl:template>
</xsl:stylesheet>

 
표시: