2015-01-30 9 views
0

Windows Terminal Server 2008 이상에서 작업을 예약하고 10 분마다 실행하고 "outlook.exe"와 같은 일부 프로세스를 종료합니다. 그러나이 작업 만 수행하면됩니다. 다른 TerminalServer에서 연결하는 사용자 (모든 사용자가 동일한 클라이언트 이름을 가짐 - 사용자 쉘이 자체 컴퓨터에서 Outlook 사용 - homeoffice에서 연결하는 사용자로 인해 Outlook을 설치해야 함).Windows TS : 클라이언트 이름이 XYZ 인 사용자의 작업을 종료합니다.

taskmanager는 사용자 이름, 프로세스 및 클라이언트 이름을 표시합니다.

이 작은 코드는 모든

strComputer에 = 로그온 한 사용자 목록에 잘 작동 "." objWMI = GetObject를 ("winmgmts를 :"_ & "{impersonationLevel = 가장 할}는 \!"_ & strComputer에 & "\ 루트 \ cimv2를")를 설정

설정 colSessions = objWMI.ExecQuery _ ("선택 *에서 Win32_LogonSession 어디 로그온 유형 = 10 ")

하면 0 그리고 에코 = colSessions.Count"대화 형 사용자가 RDP 세션을 " 다른 에코"를 찾을 수 없습니다 : "각 objSession를 들어 colSessions 설정 colList = objWMI.ExecQuery (에"의 ASSOCIATORS " _ & "{Win32_LogonSession.LogonId ="colList 에코의 각 objItem를 들어objSession.LogonId & "}"_ & "어디 AssocClass = Win32_LoggedOnUser 역할 = 종속") "사용자 이름 :"& objItem.Name & "하면 FullName"& objItem.FullName 다음 다음 끝

사용자가 얻을 수 있다면 자신의 클라이언트 이름은

설정 objShell = CreateObject를 ("WScript.Shell") ClientComp =여기처럼 보여objShell.ExpandEnvironmentStrings ("% clientname %")

하지만 모든 사용자가 자신의 vbs를 영구히 열지 않게하고 싶습니다. 작업은 관리자 우선 순위로 예약해야합니다. vbs와 WMI를 사용하여 이것을 실현할 수있는 방법이 없을 것 같습니다. 누군가 당신에게 힌트를주십시오.

+0

관리자 사용자와 함께 작업을 예약해야하는 특별한 이유가 있습니까? 설명 된 동작에 대해 사용자 권한으로 실행하면 각 사용자가 자신의 시각을 잃을 수 있습니다. 또한 gpos를 사용하면 특정 사용자가 항상 10 분을 부여하는 대신 exe를 실행하도록 거부함으로써 모든 것을 막을 수 있습니다. 많은 사람들이 다시 Outlook을 다시 열어 줄 것을 기대합니다 – Syberdoor

+0

내 의도는 오직 하나의 스크립트 만 실행해야한다는 것입니다. 시스템 우선 순위로 실행할 수 있습니다. 일부 사용자는 - homeoffice와 다른 TS에서 연결하기 때문에 사용자 기반이 불가능합니다. 홈 오피스는 전망과 다른 사람들을 사용해서는 안됩니다. 그들이 시간 제한보다 다시 Outlook을 열면 예를 들어 3 분이므로 TS에 Outlook을 사용하는 것이 중요합니다. – whowhywhere

+0

예, 사용자 권한으로 실행하지만 클라이언트 이름은 계속 확인합니다. 여러 스크립트가 동시에 실행되는 것은 좋지만 성능이 많이 떨어지는 것은 아닙니다. Win32_environment가 휘발성이기 때문에 클라이언트 이름을 포함하지 않는 것처럼 보이기 때문에 불행히도 wmi 쿼리로 내 아이디어를 발견했으며 applocker gpo도 작동하지 않습니다. 그래서 어떤 종류의 로그온 스크립트가 필요합니다. 어쨌든 – Syberdoor

답변

0

실현할 방법이 있습니까? 아마도 파워 쉘이나 다른 것?

+0

은 관리자 사용자와하기가 힘들다는 것을 말해주었습니다. 클라이언트 이름이 각 사용자마다 다르므로이를 강력히 권고합니다. 또한 닫으려는 생각은 열려있는 것을 막는 것만 큼 좋지 않습니다. 관리자 권한으로 실행하는 것을 고집한다면 내일 가능한 해결책에 대한 힌트를 제공 할 수 있습니다. 참고로, 귀하는 추가 질문을 답으로 게시하지 말고 질문을 편집하거나이 사이트의 의견을 사용하십시오. – Syberdoor

+0

안녕하세요, 귀하의 도움에 감사드립니다. 열려고하는 것을 방지하기 위해 내 fav도 할 수 있지만, 다른 사용자가 다른 컴퓨터 (홈 PC)에서 로그온 한 경우 동일한 사용자가이 프로그램을 열도록 허용해야하는 경우 – whowhywhere

+0

admin 실행 스크립트에 대한 내 솔루션을 게시했지만 또한 사용자 행동에 대해 얼마나 많이 말할 수 있는지에 따라 안정적으로 예방할 수있는 개념을 가진 두 번째 답변으로 게시됩니다. – Syberdoor

0

당신은 내가 다음을 시도 할 관리자와 함께이 작업을 수행해야하는 경우 :

환경 변수는 모두 레지스트리에 저장됩니다. 우리는 현재 로그온 한 모든 사용자 (서비스 계정과 "다음 계정으로 실행"명령과 함께 사용되는 사용자)을 찾은 HKEY_USERS 하이브를 통해 반복합니다. 서비스 계정 (SID가 S- 1-5-21) 그리고 다른 모든 것들에 대해서 우리는 키 HKEY_USERS \\ 휘발성 환경에 하위 키가 있는지 확인합니다. 각각은 CLIENTNAME을 포함 할 수 있습니다. 당신이 그 기계 키 이름으로 그들을 mathcing 그 열쇠에 반응 할 수 있다면 내가 expirience에서 하위 키는 1, 2 또는 둘 다 될 수 있지만 두 개의 다른 CLIENTNAMEs가 허용되는 상황을 생각할 수 없다는 것을 알고 있지만 틀릴 수도 있습니다 .

가 대신 내 인쇄
Const HKEY_USERS = &H80000003 

strComputer = "." 
Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv") 

' Grab a list of All User SIDs 
objRegistry.EnumKey HKEY_USERS, "", arrSubKeys 

' Loop Through all User SIDs skip the ones that are service users and their classes hives 
For Each strSubKey In arrSubKeys 
    If Left(strSubKey, 8) = "S-1-5-21" And Not Right(strSubKey, 8) = "_Classes" Then 
     ' The volatile environment key can have subkeys 
     ret = objRegistry.EnumKey(HKEY_USERS, strSubKey & "\Volatile Environment", arrVolatileEnvironmentSubKeys) 
     If ret = 0 Then 
      For Each strVolatileEnvironmentSubKey In arrVolatileEnvironmentSubKeys 
       objRegistry.GetStringValue HKEY_USERS, strSubKey & "\Volatile Environment", "USERNAME", strUsername 
       retClientname = objRegistry.GetStringValue(HKEY_USERS, strSubKey & "\Volatile Environment\" & strVolatileEnvironmentSubKey, "CLIENTNAME", strClientname) 
       If retClientname = 0 And strClientname <> "" Then 
        WScript.Echo strUsername & " is logged on remotely from " & strClientname 
       Else 
        WScript.Echo strUsername & " is not logged on remotely " & strClientname 
       End If    
      Next  
     End If 
    End If 
Next 

은 물론 것 더 우아한 해결책을 작업을 살해하는 대신 사용자의 요구

0

에 맞는 정교한 논리를 넣을 수 있습니다 :이 원리의 기본 구현은 다음 스크립트 것 시작을 방해합니다. 이는 DisallowRun 키를 통해 수행 할 수 있습니다.

당신은 지금 좋은 설명과 함께 새 하위 키 아래에 REG_SZ를 만들 수 있습니다 재부팅 후

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\ 

와 하위 키

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\DisallowRun\ 

에서 값 1이있는 DWORD disallowrun을을 만들 것입니다

value "outlook.exe".

이제 트릭은 물론 클라이언트 이름 정보를 기반으로 설정하는 것입니다. 일정 시간 동안 사용하지 않으면 세션을 끊는 것이 쉬운 일은 아닙니다. 이 reg 키를 설정하거나 삭제하는 사용자 실행 키 또는 시작 폴더에 스크립트를 넣으면됩니다.

사용자가 세션을 로컬에서 열고 집으로 돌아가서 동일한 세션을 계속할 수 있으면 예약 된 작업이 다시 필요합니다. 특정 시간이 지난 후에 가장 좋은 일이 사건에서 촉발 될 것입니다. 잠금 해제 이벤트 (this so thread에 따라 추가 감사가 필요함)가 작동해야한다고 생각합니다. 클라이언트 이름을 검사하고 그에 따라 reg 키를 변경하고 실행중인 경우 Outlook을 종료하는 스크립트를 트리거합니다.

+0

감사합니다. 우리는 세션을 시간 초과로 죽이지 않으며, 사용자는 "집으로 돌아가서"그들의 세션을 사용할 수 있습니다. 나는 당신의 제안을 시도 할 것이다. – whowhywhere

+0

행운이 있으면 계속 업데이트 해주세요.나는 그것을 게시하지 않을 것 같은 더러운 해킹 일 뿐이라는 최종 아이디어를 가지고있다. 그러나 아무 것도 작동하지 않으면 그것을 시도하고 싶은지 말해 줄 수있다. – Syberdoor