728x90

Lync Service를 서비스관리자에서 한땀한땀 올리려면 대기시간과 귀차니즘의 극에 달한다.

하지만 파워쉘 명령 두번이면 재시작 끝이다.

 

 1. Open the Lync Server Management Shell.

2. Run the following Lync Server PowerShell commands in the given order:

Stop-CsWindowService

 

Start-CsWindowsService

 

참 쉽죠이~

 

끝.

728x90
728x90

사용자 AD 값을 보고 싶을 경우 아래와 같이 단일 사용자로 추출이 가능하다.

 

CSVDE -d "CN=EXID,OU=Test,DC=mani4u,DC=com" -f c:\exid.txt

 

끝.

728x90
728x90

 

안녕하세요.

DBAnalyze는 관리자가 Lync Server 2013 데이터베이스에 대한 분석 보고서를 수집할 수 있도록 돕는 명령줄 도구입니다. DBAnalyze에는 다음과 같은 모드(진단, 사용자 데이터, 전화 회의, MCU, 디스크 조각화)가 있습니다.

 

실행 샘플)

DBAnalyze.exe /user:test@mani4u.com /report:user/sqlserver:PrimryRegistrarHost\rtcloal >c:\test_dbanalyze.txt

 

 

  • 진단 모드   테이블(레코드 , 조각화, 데이터 크기, 인덱스 크기), 데이터 로그 파일 크기, 마지막으로 백업한 시간, Microsoft Office Communications Server 실행 중인 서버의 대화 상대 분포, 사용 권한의 평균 , 대화 상대, 컨테이너, 구독, 게시, 사용자당 끝점, 잘못 이동된 사용자, 라우팅되지 않는 사용자, 사용자별로 주최한 전화 회의의 평균 , 예약된 전화 회의, 활성 전화 회의, 데이터베이스 버전에 대한 정보를 포함하는 보고서를 생성합니다.

참고:

진단 모드로 실행하면 서버 성능에 영향을 줄 수 있습니다.

  • 사용자 데이터 모드  특정 사용자 또는 해당 사용자가 자신의 대화 상대 사용 권한 목록에 있는 사용자의 대화 상대, 컨테이너, 구독, 게시, 사용 권한, 대화 상대 그룹 데이터를 보고합니다. 또한 모드에서는 사용자가 주최하거나 초대된 전화 회의에 대한 요약 데이터를 보고합니다.
  • 전화 회의 모드   전화 회의가 예약된 모든 시간 세부 정보, 초대 대상자 목록, 전화 회의에 허용된 미디어 유형 목록, 활성 MCU(Multipoint Control Unit), 활성 참가자 목록, 참가자의 신호 상태를 비롯한 특정 전화 회의에 대한 자세한 데이터를 보고합니다.
  • 모임 ID 디코딩   /pstnid 스위치로 지정되었지만 자세한 정보를 위해 백 엔드에 연결되지 않은 PSTN(공중 전화망) 모임 ID를 디코딩합니다.
  • 전화 회의 확인   /pstnid 스위치로 지정된 PSTN 모임 ID를 디코딩하고 해당 ID가 나타내는 전화 회의에 대한 정보를 표시합니다.
  • MCU 모드  풀의 MCU 대한 ID, 미디어 유형, URL, 하트비트 상태, 전화 회의 부하, 참가자 부하를 보고합니다.
  • 디스크 조각화 모드  모든 디스크의 조각화 상태를 표시합니다.

이 도구는 다양한 문제를 진단하거나 관리자의 용량 계획을 돕는 데 사용됩니다. 예를 들어 서버 A에 있는 대부분의 사용자가 자신의 대화 상대로 서버 B에 있는 사용자를 선택하는 경우, 관리자는 서버 간 트래픽을 줄이기 위해 서버 A의 사용자를 서버 B로 이동할 수 있습니다.

출력

 

이 도구는 Lync Server 2013 데이터베이스에 대해 미리 정의된 보고서를 출력합니다. 경로: %ProgramFiles%\Microsoft Lync Server 2013\Reskit

용도

 

Dbanalyze.exe를 설치하려면 로컬 폴더로 복사한 다음 도구를 실행합니다. 도구를 사용하려면 명령줄에서 다음 명령을 실행합니다. dbanalyze.exe [/v] [/report:value] [/sqlserver:value] [/user:user@domain.com] [/conf:value][/pstnid:Value] [/maxcontacts:value] 아래에 명령줄 옵션에 대한 설명이 나와 있습니다.

 

 

예제

 

다음은 유효한 Dbanalyze.exe 명령의 예입니다.

복사

dbanalyze.exe /report:diag
dbanalyze.exe /report:user /user:usera@domainb.com
dbanalyze.exe /report:conf /user:bob@example.com /conf:1W9J71SKSX2X
dbanalyze.exe /report:resolve /pstnid:12345
dbanalyze.exe /report:mcus
dbanalyze.exe /report:disk

요약

 

DBAnalyzer를 사용하면 관리자가 Lync Server 2013 데이터베이스를 빠르고 쉽게 분석할 수 있습니다.

 

 

 

 

 

728x90
728x90

LYNC2013 설치하기 위한 포스트 공유

1. DNS 구성

 

 

 2. 인프라 구성 포스트

 

3. IM AND PRESENCE 작동 프로세스

 4. AV AND WEB CONFERENCING 프로세스 포스트

 5. APPLICATION SHARING 프로세스 포스트

 5. ENTERPRISE VOICE 프로세스 포스트

6.  CMS(Central Management Store) 프로세스 포스트

 

결론 - 이해 불가...ㅡ.ㅡ 난 돌떵인가벼.

끝.

 

728x90
728x90

Skype For Business가 LYNC2013 차기작으로 출시 됨으로 인해,

기존 LYNC2013을 사용 중인 고객사가 난리가 났다.

왜!!! LYNC UI가 Skype For Business UI로 변동 되는 현상과 Preview CU 후 로그인이 안되는 현상이 발생 되었다.

시간이 지나 알게 된 사실이지만 정식 CU에서는 정상 로그인이 되어 그나마 다행이다.(KB2889923,KB2889853)

 

Update skype UI로 변경 될 경우 아래와 같이 RegistryLync 2013 으로 변경할 수 있습니다.
0: Lync 2013 1: Skype UI
-HKEY_CURRENT_USER\Software\Microsoft\Office\Lync\EnableSkypeUI

 

 

MSG 나빠~~~ 말도 없이 이러기야~

끝. 

728x90
728x90

안녕하세요.

주현애비 입니다.

오늘은 Lync SErver 전체 사용자 버디리스트 및 그룹을 조회 하는 쿼리를 알아보도록 하겠습니다.

각 사용자는 ResourceID라는 것이 있습니다. 대부분의 이 ResourceID와 연결 고리 관계를 가지고 있다라고 볼수 있습니다.

1. ResourceID를 알기 위해서는 Resource Table에 본인의 'Sip Address'를 조건에 넣어 주시면 알수 있습니다.(F/E RCT DB)

===================================================

select * from Resource
 where UserAtHost = 'testh001@mani4u.com'

ResourceId  UserAtHost
3680            testh001@mani4u.com

===================================================

제 ResourceID는 "3680"이네요.

 

2.  사용자의 버디리스트를 확인 방법

Contact Table : 모든 사용자의 버디리스트가 있는 테이블입니다.

OwnerID는 본인의 ResourceID와 동일 합니다.

BuddyID는 사용자가 추가한 ResourceID입니다.

자 그럼 제가 추가한 사용자를 쿼리 해볼까요. 1번에서 봤듯이 제 ResourceID는 "3680"이었습니다.

select * from Contact

where OwnerId= '3680'

OwnerId BuddyId
3680       35
3680       36
3680       41
3680       42
3680       44
3680       45

제 버디리스트에는 6명이 존재하는 것을 알수 있네요.

거꾸로 생각해보면 상대방ID를 누가 추가 했는지도 알수 있겠네요.ㅋ

 

3. 버디 그룹 확인 방법

ContactGroup Table : 모든 사용자의 그룹이 있는 테이블입니다.

ContactGroup도 마찬가지로 OwnerId가 존재합니다. 즉 본인의 ReourceID와 동일하다는 것이고요.

각 OwnerID는 GroupNumber 필드의 값들은 1부터 그룹갯수만큼의 Sequence Number가 들어 있습니다.

기본적으로 GroupNumber 필드는 모든 사용자가 1과 2 값은 들어가 있습니다.

1값은 틸드(~)그룹으로 추가 되는 모든 사용자가 포함 되는 그룹입니다.

2값은 "다른 연락처(Pinned Contacts)"그룹입니다.

자 그럼 제 그룹이 몇개나 존재하는지 조회를 해보겠습니다.

select OwnerId , GroupNumber, cast(DisplayName as xml) as 그룹 from ContactGroup
where OwnerId =3680

OwnerId GroupNumber 그룹
3680       2                   Pinned Contacts
3680       1                    ~
3680       3                   그룹1
3680       4                   그룹2
3680       5                   그룹3

 

총 5개의 그룹이 존재 합니다.

요점 정리를 하자면 전체 버디 및 그룹을 잘 백업 하면 복원도 가능 합니다.

또한, 전체 사용자 백업을 위한 검증도 할 수 있겠죠.^^

끝.

 

 

 

 

 

728x90
728x90

F/E간 DB 복제 상태를 확인 하는 파워쉘 명령어이다.

정책배포라던지 Deploy 변경 시, 복제가 정상적으로 끝난 후 확인 하면 되겠다.

1. 기본 명령어

Get-CsManagementStoreReplicationStatus

 

2. Fales만 확인하는 명령어

Get-CsManagementStoreReplicationStatus | Where-Object {$_.UpToDate -eq $False}

 

전 F/E가 많기때문에 2번 방법을 선호 한다.

 

끝.

728x90
728x90

버디리스트를 파워쉘로 백업을 꼭 받아두자.

고객사 PM작업 이후 버디리스트가 유실 되는 현상이 발생 되었다.

그러나 백업의 유효성은 검증 되지 못하는 점이 아쉽다.

왜냐면 유실 사용자의 버디를 복원 해보니 아무것도 존재 하지 않는다는 사실!!!

헐!!!!

일단 가장 간당하게 백업 및 복원 할 수 있는 방법이고 Lync에서 제공 되기에 신뢰성은 높다고 본다.

 

1. 전체백업과 복원

a.전체 백업

Export-CsUserData -PoolFqdn "pool.domain.com" -FileName "C:\Logs\ExportedUserData.zip"

b.전체 백업 복원

Import-CsUserData -PoolFqdn "pool.domain.com" -FileName "C:\Logs\ExportedUserData.zip"

c.업데이트를 통한 전체 복원

 Update-CsUserData -PoolFqdn "pool.domain.com" -FileName "C:\Logs\ExportedUserData.zip"

 

2. 사용자 백업과 복원

a. 사용자 백업

Export-CsUserData -poolfqdn "pool.domain.com" -UserFilter "sipaddress" -FileName "D:\test001.zip"

b. 업데이트를 통한 복원

 Update-CsUserData -poolfqdn "pool.domain.com" -UserFilter "sipaddress" -FileName "D:\test001.zip"

 

3. 버디리스트 복원에서 특정 사용자만 XML Convert 방법

이것은 버디리스트 후 특정 사용자가 그룹 및 버디가 정상적으로 있는지 XML로 변환 후 정상적으로 있는지 확인을 위한 것이다.

 Convert-CsUserData -InputFile " d:\ExportedUserData.zip" -OutputFile "D:\Logs\Lync2010data.xml" -TargetVersion Lync2010 -UserFilter "sipaddress"

 

유효성이 검증 되지 않아 별도 2차 백업 및 복원 방법은 전체 F/E의 백업을 매일/재부팅작업전DB와 작업 후 DB를 백업 받은 후 검증하여 유실 사용자가 있는지 파악하여 WCF를 통하여 복원하였다.

시간이 되면 그때 공유 하도록 하겠습니다.

 

끝.

728x90
728x90

1. Lync 안드로이드,아이폰,아이패드 로그인 이력을 뽑아달라는 고객의 요청에 의해 Back-End / LCSCDR DB

에서 아래와 같이 뽑아주었다.

USE LCSCDR

 declare @SipAddress nvarchar(200),
  @StartDate datetime,
  @EndDate datetime,
  @CurrPage int

select @SipAddress = 'test001@mani4u.com', @CurrPage = 1, @StartDate = cast('2015-01-01' as datetime), @EndDate = cast('2015-05-30' as datetime)
select @SipAddress, @CurrPage, @StartDate, @EndDate

; WITH ConnectionLog AS
(
 SELECT  ROW_NUMBER() OVER(ORDER BY reg.RegisterTime desc) AS rownum
    , DATEADD(minute, DATEDIFF(minute, sysutcdatetime(), sysdatetime()), reg.SessionIdTime) AS SessionIdTimeS 
    , reg.SessionIdSeq
    , usr.UserUri AS SipAddress 
    , DATEADD(minute, DATEDIFF(minute, sysutcdatetime(), sysdatetime()), reg.RegisterTime) AS LoginTime 
    , DATEADD(minute, DATEDIFF(minute, sysutcdatetime(), sysdatetime()), reg.DeRegisterTime) AS LogoutTime 
    , reg.IpAddress 
    ,CASE WHEN reg.[DeRegisterTypeId] = 1 THEN N'정상종료' 
      WHEN reg.[DeRegisterTypeId] = 2 THEN N'접속만료' 
      WHEN reg.[DeRegisterTypeId] = 3 THEN N'비정상종료' 
      WHEN reg.[DeRegisterTypeId] = 4 THEN N'사용자속성변경' 
      WHEN reg.[DeRegisterTypeId] = 5 THEN N'POOL변경' 
      WHEN reg.[DeRegisterTypeId] = 6 THEN N'Client버전문제' 
      ELSE N'알수없음' END AS LogoutReason 
    ,CASE WHEN reg.[RegistrarId] = 1 THEN N'Lync 2013 Client' 
      WHEN reg.[RegistrarId] = 1003 THEN N'Lync 2013 Client' 
      WHEN reg.[RegistrarId] = 1002 THEN N'MSPL' 
      WHEN reg.[RegistrarId] = 2002 THEN N'MSPL'  
      WHEN reg.[RegistrarId] = 2003 THEN N'MSPL'  
      ELSE N'ETC' END AS ClientVer 
    , REPLACE(ser.ServerFQDN,'.adatum.com','') AS ServerFQDN 
    , REPLACE(poo.PoolFQDN,'.adatum.com','') AS PoolFQDN 
    , reg.EdgeServerId 
    , CASE WHEN reg.IsInternal = 1 THEN N'내부' ELSE N'외부' END AS IsInternal 
    , reg.IsUserServiceAvailable 
    , reg.IsPrimaryRegistrar 
    , reg.IsPrimaryRegistarCentral 
    , reg.ResponseCode 
    , reg.DiagnosticId 
    , reg.DeviceId 
    , reg.EndpointId 
    , reg.EndpointEra 
    , (SELECT top 1 [Version]  FROM [LcsCDR].[dbo].[ClientVersions] where reg.ClientVersionId=[VersionId])  as VersionName
 FROM  Registration reg 
   INNER JOIN Users usr  
    ON reg.UserId = usr.UserId 
    INNER JOIN Pools poo  
    ON reg.PoolId = poo.PoolId  
    INNER JOIN Servers ser  
    ON reg.RegistrarId = ser.ServerId  
   INNER JOIN (
     SELECT [VersionId]  FROM [LcsCDR].[dbo].[ClientVersions]
     where 1=1
     and (charindex('Android', Version) > 0
      or charindex('iPhone', Version) > 0
      or charindex('iPad', Version) > 0)
   ) VER
   ON VER.[VersionId] = reg.ClientVersionId
 WHERE  (1 = 1)  
 --AND   (usr.UserUri = @SipAddress)  
    AND   dateadd(minute, datediff(minute, sysutcdatetime(), sysdatetime()), reg.[RegisterTime])  
    BETWEEN DATEADD(day,0,CONVERT(VARCHAR(10), @StartDate,23))  
 AND DATEADD(day,1,CONVERT(VARCHAR(10), @EndDate,23)) 
)
SELECT * FROM ConnectionLog
 --WHERE rownum BETWEEN (@CurrPage-1) * 50 + 1 AND @CurrPage * 50

 

2. 전체 로그인 이력 뽑는 쿼리

 

declare @SipAddress nvarchar(200),
  @StartDate datetime,
  @EndDate datetime,
  @CurrPage int

select @SipAddress = 'test@mani4u.com', @CurrPage = 1, @StartDate = cast('2015-01-01' as datetime), @EndDate = cast('2015-05-30' as datetime)
select @SipAddress, @CurrPage, @StartDate, @EndDate

; WITH ConnectionLog AS
(
 SELECT  ROW_NUMBER() OVER(ORDER BY reg.RegisterTime desc) AS rownum
    , DATEADD(minute, DATEDIFF(minute, sysutcdatetime(), sysdatetime()), reg.SessionIdTime) AS SessionIdTimeS 
    , reg.SessionIdSeq
    , usr.UserUri AS SipAddress 
    , DATEADD(minute, DATEDIFF(minute, sysutcdatetime(), sysdatetime()), reg.RegisterTime) AS LoginTime 
    , DATEADD(minute, DATEDIFF(minute, sysutcdatetime(), sysdatetime()), reg.DeRegisterTime) AS LogoutTime 
    , reg.IpAddress 
    ,CASE WHEN reg.[DeRegisterTypeId] = 1 THEN N'정상종료' 
      WHEN reg.[DeRegisterTypeId] = 2 THEN N'접속만료' 
      WHEN reg.[DeRegisterTypeId] = 3 THEN N'비정상종료' 
      WHEN reg.[DeRegisterTypeId] = 4 THEN N'사용자속성변경' 
      WHEN reg.[DeRegisterTypeId] = 5 THEN N'POOL변경' 
      WHEN reg.[DeRegisterTypeId] = 6 THEN N'Client버전문제' 
      ELSE N'알수없음' END AS LogoutReason 
    ,CASE WHEN reg.[RegistrarId] = 1 THEN N'Lync 2013 Client' 
      WHEN reg.[RegistrarId] = 1003 THEN N'Lync 2013 Client' 
      WHEN reg.[RegistrarId] = 1002 THEN N'MSPL' 
      WHEN reg.[RegistrarId] = 2002 THEN N'MSPL'  
      WHEN reg.[RegistrarId] = 2003 THEN N'MSPL'  
      ELSE N'ETC' END AS ClientVer 
    , REPLACE(ser.ServerFQDN,'.adatum.com','') AS ServerFQDN 
    , REPLACE(poo.PoolFQDN,'.adatum.com','') AS PoolFQDN 
    , reg.EdgeServerId 
    , CASE WHEN reg.IsInternal = 1 THEN N'내부' ELSE N'외부' END AS IsInternal 
    , reg.IsUserServiceAvailable 
    , reg.IsPrimaryRegistrar 
    , reg.IsPrimaryRegistarCentral 
    , reg.ResponseCode 
    , reg.DiagnosticId 
    , reg.DeviceId 
    , reg.EndpointId 
    , reg.EndpointEra 
 FROM  Registration reg 
   INNER JOIN Users usr  
    ON reg.UserId = usr.UserId 
    INNER JOIN Pools poo  
    ON reg.PoolId = poo.PoolId  
    INNER JOIN Servers ser  
    ON reg.RegistrarId = ser.ServerId  
 WHERE  (1 = 1)  
 AND   (usr.UserUri = @SipAddress)  
    AND   dateadd(minute, datediff(minute, sysutcdatetime(), sysdatetime()), reg.[RegisterTime])  
    BETWEEN DATEADD(day,0,CONVERT(VARCHAR(10), @StartDate,23))  
 AND DATEADD(day,1,CONVERT(VARCHAR(10), @EndDate,23)) 
)
SELECT * FROM ConnectionLog
 WHERE rownum BETWEEN (@CurrPage-1) * 50 + 1 AND @CurrPage * 50  

 

728x90

+ Recent posts