Windows에서 제공하는 Alert 기능을 활용하여 시스템 관련 모니터링을 하는 경우가 있다. Event Log에 이력을 남겨 관리할 수 있으며, 특정 조건 (임계치를 초과 할 경우)에서 수행할 동작을 미리 지정하여 시스템 운영의 자동화에 도움을 줄 수 있다.

 

이때 강력하게 사용할 수 있는 명령어가 “Logman.exe”란 명령어이다. 결론부터 말하자면 Windows 2003 과 Windows 2008에서 Command 로 수행될 수 있는 방법에는 약간의 차이가 있다.

 

Windows 2003에서 Logman.exe 명령어는 counter & trace Log만 명령어로 수행할 수 있다. 만약 성능로그를 활용해서 시스템 모니터링을 강화하고 싶다면, 특정 Registry 값을 Export하여 다른 서버에 등록해야 하는 번거로움이 있다.

 

[참고] Perfmon 中 Alert Log 배포를 쉽게 하는 방법

 

1. 원본 Source 서버에서 성능 모니터링을 수행하고자 하는 항목에 대한 Template을 작성한다.

 

image

 

2. 새로 생성한 Registry값을 확인하여 SID값을 원하는 값으로 수정한다.

 

   Key Value : HKLM\SYSTEM\CurrentControlSet\Services\SysmonLog\Log Queries

 

   image

 

3. 수정한 Registry 값을 Export 받은 후 다른서버에 적용한다.

 

만약 특정 Action 발생 후 Script를 실행한다면 수행할 계정을 선택하게 된다. 이러한 경우에는 배포하려는 서버에 공통계정을 만들어 두어 관리를 한다면 좀 더 효과적인 관리가 될 수 있다.

 

그럼 Windows 2008에도 똑같은 위치에 Registry값이 존재할까? 대답은 No!!!이다. 물론 Windows 2003의 Registry값을 등록할 경우 Key Value는 등록이 되며 Windows 2008 Perfmon에도 해당 설정된 값은 보이게 되지만 실행은 되지 않는다.

그럼 Windows 2008에는 이러한 작업을 일일히 해야 하는 것일까?

 

이런 Case일 경우 Windows 2008에서는 logman.exe 명령어를 사용하면 된다.

 

image

 

Windows 2008에서 logman 실행화면이다. 각 Command에 따라서 자세한 설명을 보고싶다면, 가령 예들들어 perfmon관련 Counter를 새로 만들고 싶다면 “logman create /?” 이런 방법으로 각 세부 설명을 볼 수 있다.

 

image

 

위 그림에서 확인할 수 있듯이 Windows 2008에서는 alert 뿐만이 아닌 구성 & API관련 내용에 대한 항목도 Command로 수행할 수 있다. 생성 뿐만이 아닌 수정도 아래와 같이 Command Base로 가능하다.

 

image

 

특정 Registry값을 몰라도 일반 CMD명령어로 alert 설정이 가능하기 때문에 배포를 손쉽게 할 수 있으며 내용 수정또한 쉽게 할 수있어 앞으로 이와 같은 Command를 활용하여 Windows서버 관리를 좀더 효율적으로 하면 좋지 않을까~~~^^

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by hotpoto

요즘 Terminal Server 관리 자동화를 위해 VBS를 이용하고 있다. 거의 완전 초보 수준이라 몇개 Script를 이용해서 만들기는 하지만 Output에 대해서는 나름 만족하고 있다. 더 나은 로직으로 관리를 하신 분들도 분명히 계실것이라 생각된다.^^ (저의 블로그를 방문해 주시는 고수 분들의 많은 지적도 부탁드립니다)

 

참고 : http://www.microsoft.com/technet/scriptcenter/default.mspx

 

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

CPU & MEM 과점유 프로세스 Kill

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

 

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Const ForAppending = 8
Const CONVERT_TO_LOCAL_TIME = True

Set dtmStart = CreateObject("WbemScripting.SWbemDateTime")
dtmStart.SetVarDate Now, CONVERT_TO_LOCAL_TIME

dtmRegular = dtmStart.GetVarDate(CONVERT_TO_LOCAL_TIME)

 

'Kill 하려는 프로세스 Name

Set colProcessList = objWMIService.ExecQuery _
    ("Select * from Win32_Process Where Name = '프로세스이름'")

For Each objProcess in colProcessList
    Wscript.Echo "Process: " & objProcess.Name & " ProcessID : " & objProcess.ProcessID
    dtmStartTime = objProcess.CreationDate
    strReturn = WMIDateStringToDate(dtmStartTime)
    Wscript.Echo strReturn
    Wscript.Echo "Working Set Size: " & objProcess.WorkingSetSize /1024 / 1024
    Wscript.Echo  "CPU Usage : " & CPUUSage(objProcess.ProcessID)


'CPU 사용시간 확인, 단위 : Second
    sngProcessTime = ( CSng(objProcess.KernelModeTime) + _
            CSng(objProcess.UserModeTime)) / 10000000

    timeFlag = DateDiff("h", strReturn, dtmRegular)
    Wscript.Echo "======================================================"

'CPU Time과 CPU사용률을 비교 – CPU 수행시간이 4시간이상 프로세스 중 사용률이 20% 이상, 메모리 사용률 2G 이상
    If   ((sngProcessTime > 18000 And CPUUSage(objProcess.ProcessId) > 20) Or objProcess.WorkingSetSize /1024/1024 > 2000  ) then
        Set objFSO = CreateObject("Scripting.FileSystemObject")
            Set objFile = objFSO.OpenTextFile("파일경로", ForAppending)

 

'Application 에서 teminate function을 사용할 경우 적용가능           
        'objProcess.Terminate()

 

'그렇지 않을 경우 CMD 명령어로 해당 프로세스 Kill
        Rem------------------------------------------------
          Set wshShell = WScript.CreateObject ("WSCript.shell")
          wshshell.run "cmd /c taskkill /f /pid " & objProcess.ProcessID      
       Set wshshell = nothing
          Rem -------------------------------------------------------------
        objFile.WriteLine now & " " & objProcess.Name & " ProcessTime:" & sngProcessTime  & " memory:" & objProcess.WorkingSetSize  /1024 /1024 & " ProcessID : " & objProcess.ProcessID & " CPU Usage : " & CPUUSage(objProcess.ProcessID)
        'objFile.WriteLine "cmd /c taskkill /f /pid " & objProcess.ProcessID
        objFile.Close
    End if

Next

 

'날짜 형식을 Date로 변경하는 Function

Function WMIDateStringToDate(dtmStart)
    WMIDateStringToDate = CDate(Mid(dtmStart, 5, 2) & "/" & _
        Mid(dtmStart, 7, 2) & "/" & Left(dtmStart, 4) _
            & " " & Mid (dtmStart, 9, 2) & ":" & _
                Mid(dtmStart, 11, 2) & ":" & Mid(dtmStart, _
                    13, 2))
End Function

 

'프로세스 사용량을 가져오는 Function

Function CPUUSage( ProcID )
        On Error Resume Next
            Set objService = GetObject("Winmgmts:{impersonationlevel=impersonate}!\Root\Cimv2")
      For Each objInstance1 in objService.ExecQuery("Select * from Win32_PerfRawData_PerfProc_Process where IDProcess = '" & ProcID & "'")
          N1 = objInstance1.PercentProcessorTime
          D1 = objInstance1.TimeStamp_Sys100NS
           Exit For
       Next
        WScript.Sleep(2000)

       For Each perf_instance2 in objService.ExecQuery("Select * from Win32_PerfRawData_PerfProc_Process where IDProcess = '" & ProcID & "'")
           N2 = perf_instance2.PercentProcessorTime
           D2 = perf_instance2.TimeStamp_Sys100NS
           Exit For
       Next

       ' CounterType - PERF_100NSEC_TIMER_INV
       ' Formula - (1- ((N2 - N1) / (D2 - D1))) x 100
        Nd = (N2 - N1)
        Dd = (D2-D1)
         PercentProcessorTime = ( (Nd/Dd))  * 100
      CPUUSage = Round(PercentProcessorTime ,0)
End Function

 

지금 위와 같은 Script를 실행할 경우 결과 파일은 TXT 파일 형태로 떨어지게 된다. 만약 해당 내용을 Event Log에 뿌리고 싶다면 Event Log를 뿌리는 것을 Function으로 작성하여 Script 내에 넣으면 된다.

 

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

Citrix 환경에서 특정 User Logoff

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

 

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Const ForAppending = 8
Const CONVERT_TO_LOCAL_TIME = True

Set dtmStart = CreateObject("WbemScripting.SWbemDateTime")
dtmStart.SetVarDate Now, CONVERT_TO_LOCAL_TIME

dtmRegular = dtmStart.GetVarDate(CONVERT_TO_LOCAL_TIME)

Set colProcessList = objWMIService.ExecQuery _
    ("Select * from Win32_Process Where Name = '프로세스이름'")

For Each objProcess in colProcessList
    Wscript.Echo "Process: " & objProcess.Name & " ProcessID : " & objProcess.ProcessID & " SessionID : " & objProcess.SessionID
    dtmStartTime = objProcess.CreationDate
    Wscript.Echo "User List : " & UserList(objProcess.CSName, objProcess.SessionID) & " Session ID : " & objProcess.SessionID
    Wscript.Echo "CPU Usage :  " & CPUUSage(objProcess.ProcessId)
    Wscript.Echo "======================================================"
If   (CPUUSage(objProcess.ProcessId) >= 4) then
        Set objFSO = CreateObject("Scripting.FileSystemObject")
        Set objFile = objFSO.OpenTextFile("파일경로", ForAppending)

          Rem------------------------------------------------
          Set wshShell = WScript.CreateObject ("WSCript.shell")
          wshshell.run "cmd /c logoff " & objProcess.SessionID
          Set wshshell = Nothing
          Rem -------------------------------------------------------------
          Critical()
        objFile.WriteLine Now & " "  & "Process: " & objProcess.Name & " ProcessID : " & objProcess.ProcessID & " User List : " & UserList(objProcess.CSName, objProcess.SessionID) & " Session ID : " & objProcess.SessionID
        objFile.Close
    End if

Next

 

'날짜 형식을 Date로 변경하는 Function

Function WMIDateStringToDate(dtmStart)
    WMIDateStringToDate = CDate(Mid(dtmStart, 5, 2) & "/" & _
        Mid(dtmStart, 7, 2) & "/" & Left(dtmStart, 4) _
            & " " & Mid (dtmStart, 9, 2) & ":" & _
                Mid(dtmStart, 11, 2) & ":" & Mid(dtmStart, _
                    13, 2))
End Function

 

'프로세스 사용량을 가져오는 Function

Function CPUUSage( ProcID )
        On Error Resume Next
            Set objService = GetObject("Winmgmts:{impersonationlevel=impersonate}!\Root\Cimv2")
      For Each objInstance1 in objService.ExecQuery("Select * from Win32_PerfRawData_PerfProc_Process where IDProcess = '" & ProcID & "'")
          N1 = objInstance1.PercentProcessorTime
          D1 = objInstance1.TimeStamp_Sys100NS
           Exit For
       Next
        WScript.Sleep(20)

       For Each perf_instance2 in objService.ExecQuery("Select * from Win32_PerfRawData_PerfProc_Process where IDProcess = '" & ProcID & "'")
           N2 = perf_instance2.PercentProcessorTime
           D2 = perf_instance2.TimeStamp_Sys100NS
           Exit For
       Next

       ' CounterType - PERF_100NSEC_TIMER_INV
       ' Formula - (1- ((N2 - N1) / (D2 - D1))) x 100
        Nd = (N2 - N1)
        Dd = (D2-D1)
         PercentProcessorTime = ( (Nd/Dd))  * 100
      CPUUSage = Round(PercentProcessorTime ,0)
End Function

 

' User Name을 불러오는 Function

Function UserList(aServer, aSession)

On Error Resume Next
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\Citrix")
Set colItems = objWMIService.ExecQuery( "SELECT * FROM MetaFrame_Process where ServerName = '" & aServer & "' and SessionID = '" & aSession & "' and ProcessName = '프로세스이름'")

For Each objItem in colItems  
    username = objItem.UserName
Next

    UserList = username

End Function

 

' 수행결과를 Event Log로 뿌리는 Function

Function Critical()

    Const EVENT_SUCCESS = 2
    Set objShell = Wscript.CreateObject("Wscript.Shell")
    objShell.LogEvent EVENT_SUCCESS, _
    "User : " & UserList(objProcess.CSName, objProcess.SessionID) & " 정상적으로 Logoff 하였습니다."
End Function

 

프로세스 Kill Script 와 연관되어 작성한 User Logoff Script이다. Xen APP서버를 서비스 하는 경우 User에 대한 정보를 일반적인 OS상에 존재하는 WMI 값에서 가져올 수 없다. Xen APP은 RDP Session으로 접근하는것이 라는 ICA Session 자체로 표시되기 때문에 User Name값을 가져올 경우에는 Citrix WMI값을 이용하여 Function화 하면 쉽게 User Name을 가져올 수 있다.

또 아래부분을 보면 Event Log로 전달하는 부분이 Function을 참고하셔도 활용할 수 있는 범위가 많을 것이라 생각된다.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by hotpoto

Terminal 환경으로 구성된 (Server Based Computing)환경에서 Idle Session 이후 특정 시간이 지날 경우 사용자를 강제로 종료 시킬 수 있는 Option을 구현할 수 있다. 실제로 Active & Idle Session Time Limit 설정이후 해당 시간이 지났을 경우 그 다음 Action을 어떻게 할 수 있는냐를 결정하는 것이다.

 

다음 Mission을 통해 구현방법을 알아보자.

 

[Mission] Terminal 접속시 장기 User가 존재하여 서버 부하를 증가시킨다. Active Session이 1일 이상 지난 사용자에 대해서는 자동 종료될 수 있게 구성한다.

 

[Action Plan]

 

  - Group Policy를 이용하여 문제를 해결함.

 

1. 해당 정책은 컴퓨터 및 사용자 정책 모두에 적용을 할 수 있으며, 일반적인 경우 컴퓨터 정책이 최우선순위다.

 

image

 

그림에 표신된 시간 제한에 도달하면 Session 종료 정책을 "사용함"으로 변경하면, 정책 적용은 끝이다.^^

 

해당 정책이 정상적으로 적용되었는지 확인이 필요하면 관리도구의 Terminal 구성을 확인해 보면 아래와 같이 비활성화 되어 있는것을 확인 할 수 있다.

 

image

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by hotpoto

Metaframe (Xen APP)이 설치된 서버에서 가장 Critical 하게 관리해야 하는 Service는 IMA 서비스 일 것이다. IMA(Independent Management Architecture)가 오동작일 경우 문제가 발생한 서버의 서비스를 제공하지 못하기 때문에 IMA Service의 관리는

Citrix사를 사용하는 SBC환경에서는 가장 중요한 Factor일 것이다.

이번에는 IMA Service에 대한 Architecture보다는 문제가 발생하였을 경우 조치하는 Tip을 정리해 보겠다.

 

1. Registry 값 비교

   - IMA Serivce에 문제가 생겼을 경우 어떤 Module에서 Fail이 되었는지... 필수 Module은 정상적으로 기동되었는지 확인해볼 필요가 있다. 문제가 생긴서버와 정상적인 서버의 Registry 값을 비교해도 좋은 방법이겠지만. 아래와 같은 Registry 값을 주기적으로 Backup 및 Audit을 진행한다면 문제 발생시 좀 더 빠르고 정확하게 문제 Factor를 찾아 낼 수 있을것이라 생각된다.

 

[HKLM\SOFTWARE\Wow6432Node\Citrix\IMA\RUNTIME] - 64 Bit Machine일 경우

image

 

그림을 보면 "ProductPlugins:라는 필드값이 있는데 비정상적으로 IMA 서비스가 기동되지 않을 경우 해당 값에 누락사항이 없는지 가장먼저 확인해 볼 필요가 있다.

 

2. 작업관리자 확인

 

   - ImaSrv.exe Process가 정상적으로 기동이 되어 있는지 확인이 필요할 것이다. 필수 Module이 Load되지 않았다면 물론 서비스 자체도 기동되지 않겠지만 서비스가 기동된 상태에서도 문제가 발생되었다면, 이는 IMA Service의 Leak현상이 발생해 서비스에 지장을 줄수도 있는 부분이다. 간헐적으로 비정상적인 경우 평소에 정상적인 경우라면 100M 정도의 Memory 사용량을 보이다가 200M 이상으로 증가될 경우 분명 비정상 적인 경우로 판단하여, IMA Service Restart 등의 조치를 취해야 할 것이다.

 

3. Event Log 확인

  

   - Event Log를 보는 기준은 한가지다. 바로 어떠한 동작에서 IMA Service가 오류를 일으켰는지 확인하는 것이다. IMA Service가 문제가 발생하였다면 Farm 내에서는 Active Server로 동작하지 않을 것이며, 이러한 이유로 인해 더이상 사용자 접근도 없을 것이다. 여기서 모든 Case를 나열 할수는 없을 것이고, 다음과 같은 오류가 Event Log에 있을 경우 조치하는 방법에 대해 알아보자.

image

 

위의 메세지는 Physical Data Store에 접근이 불가, 즉 Farm 정보를 가져오지 못함으로 IMA 서비스가 기동되지 않을 경우 발생하는 메세지 이다. 위와 같은 사항이 발생하였을 경우 조치방법은 어떻게 진행해야 할까?

 

4. 조치방법

 

  1) Local DB 확인

      - Resource Manager 있는 Local DB Size를 확인해본다.

        image

        Local DB Size가 1G이상으로 증가된것을 확인할 수 있다. 즉, 실제로 Process 기동이나, 성능정보들이 많이 쌓여서 그런

        것 일 수도 있지만 Compact 문제 일 가능성도 있기 때문에 일단 Rename을 시켜둔다.

 

   2) ODBC 연결 확인

     - 아래와 같은 경로로 이동 후 ODBC 연결을 확인해 본다.

        image

        정상적인 경우 Physical Data Store에 연결정보가 남아 있을 경우 정상이라고 판단하며, 여기서 직접 LHC를 생성할 수도

        있지만, 여기서는 명령어를 통해서 생성하는 법을 알아보자.

        LHC (Local Host Cache) : Citrix Farm 정보가 각 서버별로 Memory 공간에 상주하게 되는 것을 말함

 

   3) LHC 재생성

     - 간단하다. CMD창을 열어 다음과 같은 명령어를 입력하면 LHC를 재생성 할 수 있다.

       Command : dsmaint recreatelhc

 

   4) IMA Service 재시작

     - 1~3번까지의 조치가 모두 끝났다면, IMA Service를 재시작 해본다. 정상적인 경우 재시작이 정상으로 이루어 지겠지만.

       그렇지 않을 경우에는 Citrix 엔지니어에게 연락하여 원격지원이나 Site 지원을 받아야 할 것이다.

     - 참고로 운영중에 IMA Service를 재시작 하는 경우, 기존에 접속되어 있는 사용자에게는 영향이 없다. 그러나 IMA Service

       재시작에 실패할 경우 신규 접속 사용자는 물론 Trouble Shooting을 위해 서버를 재기동 해야 하는 경우도 있음으로

       부하가 높거나 서버 자체가 비정상적으로 판단될 경우 사용자 Logoff 이후 진행하는것이 적절할 것이다.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by hotpoto

Active Directory 정책에 대한 설정 부분에 대해 살펴보겠다. 이번 Tip은 간단한 것으로 다음과 같은 상황에서 유용하게 사용할

수 있을 것이라 생각되며, 복잡한 서버 구성에서도 유용하게 사용될 수 있을 것이라 생각된다.

[Case #1] 50대 서버가 Terminal Service 환경으로 구성이 되어 있으며, 50대 모두 Farm 개념으로 묶여 있어 모두 일괄적인 정책을 받고 있는 상황임, 그러나 고객 요청으로 인해, 특정 사용자에게만 AD정책을 수정하여야 하며, 특정 User Group은 서버를 별도로 분리할 수 없는 상황일 경우 어떻게 Group 정책을 적용해야 하는 것일까?

 

image

위와 같은 상황을 해결하는 방법은 다양하게 존재 할 수 있을 것이다. 그러나 얘기하고 싶은것은 주로 Group 정책은 사용자

단위로 적용을 하고 있지만, 위와 같이 복잡한 요구사항을 받을 경우에는 Computer (장치단위)로 Group 정책을 적용할 수

있다는 얘기다. 즉 특정 서버별로 정책을 다르게 적용해야 하는 경우나, 기존에 설정되어 있던 정책을 무시하고 기존 사용자가 가지고 있던 정책으로 적용을 받아야 하는 경우에 유용하게 이용될 수 있다.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by hotpoto

Active Directory를 운영하다 보면, 그룹정책에 대한 수정을 필요로 하는 경우가 발생한다. 예를들면, User가 Terminal서버에

접속하여 작업을 진행할 경우 특정 Drive가 보이지 않게 처리를 하는 부분이라던가, Session timeout 정책을 정의해야 할 경우

기본적으로 제공하는 Option이외에 그룹 정책을 수정해야 하는 경우 어떻게 해야 할까?^^

 

이러한 고민을 해결하는 방법은 한가지!!! 바로 ADM File을 수정하여 자신이 원하는 정책을 만들 수 있다.

 

ADM 파일

  - Active Directory의 Group Policy Administrator Template 을 말하는 것으로 각각의 정책별로 존재를 하며 주로 구성,

    Group Policy도 쉽게 말하면 Registry 값을 수정하는 하여 반영되는것이기 때문에 해당 값을 조절하여 정책 변경

 

Active Directory에서 ADM파일가 저장되는 곳은 아래와 같다. (%systemroot%sysvol\sysvol\DomainName\Policies)

image

이와 같은 경로에서 정책에 대한 SID값을 확인 후 검색해서 들어가도 되며, 다른 방법으로는 로그론 Script를 수행하는 곳에서

파일 찾기 이후 상위 폴더로 2번정도 이동하면 해당 정책의 ADM파일을 찾을 수 있다.

image

이후 ADM폴더에 들어가면 다음과 같은 파일 중 system.adm 파일을 이용하여 Group Policy 를 수정할 수 있다.

image

필요경우에는 Citrix관련 정책을 Import 할 수 있으며, 필요에 의해서 정책을 정의할 수도 있을 것이다.

 

위의 내용은 ADM파일의 위치를 확인하는 방법이다. 지금부터는 한가지 예를 들어 ADM파일을 수정해 보겠다.

 

[Case 1] Terminal 접속시 Client에게 서버의 Local Drive 중 CDROM (Z:)을 이용하지 못하게 해야함

1. 해당 정책을 정의하는 정책 및 Registry 값 찾기

   - 참고 : http://support.microsoft.com/kb/231289

   - HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer

2. ADM 파일 수정

   - system.adm 파일에서 해당 Registory 값을 찾은 후에 수정

   - 크게 레지스트리 값을 수정하여 반영 후 하단에 보면 Description 부분이 있는데 이 부분도 추가를 완료해야만

     Group Policy 정책에서 확인이 가능함

     image

 

추가적으로 몇가지 더 설정한 부분이 있는데, 여기서 중요한 것은 해당 Registry 값을 알아낸다면 Group Policy는 수정이 가능하다는 사실이다. 위에 예를 한번 연습해 본다면, 좀더 강력한 Group 정책을 통제 및 관리할 수 있을 것이다.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by hotpoto

Citrix Data Collector서버에서 Member Server Performance (Resource Manager)가 정상적으로 수집이

되지 않을 경우 아래와 같은 Event가 발생하였는지 확인해 볼 필요가 있다.

image

위 이벤트는 WMI상에 Citrix Component가 정상적으로 동작하지 않기 때문에 발생하는 메세지로 서버가

정상적으로 동작하는지 여부는 다음과 같은 방법으로 확인해 볼 수 있다.

(참고 : http://support.citrix.com/article/CTX108911)

1. 해당 Machine에 접속 후 WMI Tester를 실행해 본다.

  - 실행창에서 wbemtest.exe를 실행시키면 다음과 같은 화면이 나온다.

  - 이후 네임스페이스 부분에 root\citrix를 입력 한 후 연결을 눌러본다.

image image

2. 이후 화면에서 클래스 열기를 누르면 정상적인 화면인 경우 다음과 같은 화면을 Return한다.

image

만약 위와 같은 화면이 나오지 않고 Event Log와 같은 오류코드가 반환된다면 Citrix WMI Component가

깨진것 으로 생각하면 된다. 위와 같이 WMI가 깨졌을 경우 재컴파일 하거나 WMI만 Install하면 된다.

단, WMI Install시에 IMA Service를 내려야 하기 때문에... 어차피 서버 Down과 똑같은 효과를 지녀

별도의 PM작업이 필요할 것이다.

[Action Plan]

Re-compile the MOF files that contain the WMI class definitions.

1. Open a command prompt.

2. Change the directory to Program Files\Citrix\System32\Citrix\WMI>.

3. Run the for /f %s in ('dir /b *.mof *.mfl')do mofcomp %s command.

4. For specific files, from Step 2 execute mofcomp <file>.mof.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by hotpoto

SBC서버 운영시 요즘 많은 이슈 사항에 처해 있는듯 하다...^^ 그러나 언제나 해결방법은 있는법!!

해결방법을 찾아보다가 IME관련된 자료를 확인하게 되었다.

특정 User의 프로필 조합 문제이던지 아니면 Terminal Server Setting의 문제인지 아직은 좀더 연구를

해보아야 하겠지만 Terminal Server 특성상 Client 에서 진행되는 것은 거의 없다고 봐도 무방할듯 싶다.

먼저 각 언어별 Registry 값에 대한 설명을 참고하자!!! (http://support.microsoft.com/kb/927824/ko)

해당 자료는 Vista 기준으로 작성된 문서인데... 기본적인 값을 확인하는데는 큰 무리가 없을 것으로 생각

된다. 왜냐하면 Windows 2003에도 해당 값을 확인하였더니 동일하였기 때문에...^^

image

image

흠... 여기서 확실히 알수 있는 내용은 바로 Terminal Server에 맞는 key Board setting값을 맞추어야

한다는 사실이다. 그러나 만약 이와 같은 설정이 올바로 되어 있는데도 IME가 오류사항이 발생하면

어떠한 Action을 취해야 하는지 난감할 것이다.

필자가 생각할때는 크게 2가지로 나누어 볼 수 있다고 생각한다. 단순히 한영변환이 안된다면 기존에

설정되어 있는 키보드 설정을 무시하거나 (http://support.microsoft.com/kb/322042), 다른 언어 Set

이 설정되서 변경이 불가하다면 정밀 분석이 필요할 것이라 판단이 된다. (문제가 생기는 User와

정상적인 경우 Registry 값을 비교하는것고 하나의 방법이 될수 있겠지만....)

여기서는 통상적인 Workaround 방법인 기존 Key Board 자판 배열을 무시하는 방법을 알아보겠다.

image

위와 같이 설정할 경우 Client의 KeyboardLayout 설정을 무시할 수가 있다.

또 추가적으로 확인되는 사항이 있다면 다시 정리해서 올릴 예정이다...^^

 

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by hotpoto

Terminal Server를 이용하다 보면 Copy & Paste 문제로 어떻게 해결해야 할지 몰라 난감한 상황이 있다.

Metaframe을 이용하던지 혹은 RDP를 이용한 서비스를 하던지 동일하게 생길 수 있는 문제이다.

이러한 현상을 해결하기 위해서 어떠한 방법을 써야 하는지 크게 MS에서 제공하는 해결방법과 Citrix에서

제공하는 방법으로 나누어 살펴보자

[현상]

  - Clipboard Issue (Not use Copy & Paste)

  - 터미널 접속시 Local Application 및 Session간의 Copy & Paste 문제, 혹은 다른 Application 간의

    Copy & Paste 불가 현상 발생

[원인]

  - Terminal Session에 대한 Clipboard Chain 오동작으로 인한 문제

  - rdpclip.exe Module이 변경된 Clipboard의 내용을 감지하지 못해 Clipboard Chain이 논리적으로 깨짐

[Clipboard Chain]

Clipboard는 Application 실행 Module단위로 생성되는듯 하다. A,B,C,D라는 Application을 순차적으로

실행한다고 가정하면 Clipboard Chain은 다음과 같은 구조로 배열될 것이다.

image

Clipboard는 양방향 구조로 되어 있어며, 여기에서 말하는 Application이란 Clipboard를 사용하는 Application으로

한정한다. 만약 정상적인 경우에 C라는 Application을 종료한다고 하면 B와 D에 종료신호를 보내

Chain 구성을변경한다. 종료신호라 함은 종료함수를 호출해서 정상적으로 Application을 종료하는

방법을 말한다. 그러나 만약 정상적인 종료 외에 Module Update나 이러한 문제때문에 Process를

pkill같은 것으로 비정상적인 종료를 수행하였을 경우 이러한 Clipboard Chain이 깨어질수가 있다. 

image

이렇게 Chain이 깨졌을 경우 rdpclip.exe가 고립되어 더이상 Session간의 Copy & Paste는 진행되지

않는다. 그러면 이러한 현상을 해결하기 위해 어떠한 방법을 써야 할까?ㅋ

[MS]

이러한 현상이 발생하였을 경우에 rdpclip.exe 파일을 재시작 하면 해당 현상을 해결할 수 있다. 또한 특정

Application에 Clipboard를 정상적으로 종료할 수 있게 해주는 함수 호출부분에 대한 추가도 방법이

될 수 있다.

[Citrix]

repairCBDChain.exe Tool을 이용해서 해당 현상을 해결할 수 있다. 만약 특정 Session에서 이러한 문제가

발생하였을 경우에 해당 Tool을 실행시키면 현상을 해결할 수 있다.

단, 해당 Tool은 Citrix Process인 wfshell 동작에 관여해서 해결하는 방법으로 Metaframe Solution을

이용하는 서버만 문제를 해결할 수 있다.

  - 사용예제

Repairing clipboard chain for individual ICA sessions:

C:\>RepairCBDChain.exe "Sent Items - Microsoft Outlook - \\Remote"
C:\>RepairCBDChain.exe "Weekly report - Message - \\Remote"

Repairing clipboard chain for RDP sessions on the client machine:

HWND: 0x00000000000318A8
Class: "RdpClipRdrWindowClass"
Title: ""
20:31:59:562 S WM_DRAWCLIPBOARD (0x308) wParam: 0x31986 lParam: 0x0

C:\>RepairCBDChain.exe "" "RdpClipRdrWindowClass"

Inside RDP session on Windows XP the following rdpclip.exe window receives clipboard change notifications:

HWND: 0x0004003A
Class: "CBMonitorClass"
Title: "CB Monitor Window"
19:36:57:484 S WM_DRAWCLIPBOARD (0x308) wParam: 0x50142 lParam: 0x0

C:\>RepairCBDChain.exe "CB Monitor Window" "CBMonitorClass"

image

참조 : http://blogs.msdn.com/ts/comments/1089729.aspx

http://blogs.msdn.com/ts/archive/2006/11/20/why-does-my-shared-clipboard-not-work-part-2.aspx

http://support.citrix.com/article/CTX106226

 

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by hotpoto

image

제목은 거창하지만 내용은 무지 간단하다. Windows Service를 시작할때 중요한 한가지 Process!!

바로 services.exe이다.

이러한 services.exe는 Service Controller Manager(SCM)로 불리며 Install 시나, System Boot, System

initialization, services management / maintenance시에 이용하게 된다.

System이 boot될경우에는 services.exe가registry값을 읽어와 바로 필요한 Services를 기동하기

때문이다.

각각의 Services는 svchost.exe라는 Process Mechanism으로 실행되게 되는데 이것에 대한 설명은

다음과 같다.

svchost.exe는 DLL에서 실행되는 windows의 각종 Services를 제어하는 역활을 하는 프로세스이다.

서비스 시작시 레지스트리값을 참조하여, 서비스 대상, 위치, 시작되는 방법등을 파악한 후 유사한

것들을 모아 서비스 목록을 만드는 Process라고 할 수 있겠다. 즉 서비스들을 Grouping하여 좀더

효율적으로 관리하기 위함이라고 할 수 있겠다.

[참조하는 registry 값]

HLKM\System\CurrentControlSet\Services\Service

HLKM\Software\Microsoft\Windows NT\CurrentVersion\Svchost

Windows Internal 세미나 자료에 있던 svchost 관련 내용이다.

Windows 2000 Introduced generic Svchost.exe

   - Groups services into fewer processes

   - Improves system startup time

   - Conserves system virtual memory

   - Not user-configurable as to which services go in which processes

   - 3rd parties cannot add services to Svchost.exe processes

Windows XP/2003 have more svchost processes due to two new less privileged accounts for built-in services

   - LOCAL SERVICE, NETWORK SERVICE

   - Less rights than SYSTEM account

이러한 Services를 확인하는 방법은 Process Explorer를 이용하는 방법과 tasklist 명령을 이용하는

방법이 있다.

image

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by hotpoto

티스토리 툴바