원격 데스크톱이 아닌 RemoteApp 만 허용


11

비슷한 전제로 다음과 같은 질문을 찾았지만 질문에 대한 대답은 질문으로 진술되었습니다!

RemoteApp 사용자가 원격 데스크톱을 실행하지 못하도록 방지

RemoteApp는 허용하고 원격 데스크톱은 허용하지 않는 방법은 무엇입니까? 원격 앱을 허용하려면 "원격 데스크톱 사용자"그룹에 사용자를 추가해야 할 것 같습니다. 원격 데스크톱을 허용합니다.

"TS Web Access Computers"그룹을 사용해 보았지만 RemoteApp를 실행할 권한이 없습니다.

RemoteApp 기능은 그대로두고 원격 데스크톱을 비활성화하는 구성은 어디에 있습니까?


RemoteApp은 여전히 ​​TS / RDS입니다. 여전히 서버를 동일하게 보호해야합니다.
Chris S

당사 서비스의 전제이지만 응용 프로그램 만 사용할 수 있다는 점에 동의합니다. 시스템의 오버 헤드를 줄이기 위해 데스크탑에 대한 전체 로그인이 제공되지 않습니다. 그들이 Evan이 언급 한 것처럼 문제를 해결한다면, 우리는 그 경우를 처리 할 수 ​​있습니다. 이것은 보안 문제가 아니라 리소스 문제입니다.
Brett Allen

답변:


12

기본적으로 TS RemoteApp 기능은 기존 원격 데스크톱 코드를 활용하기 때문에 "공식적으로 승인 된"방법은 없습니다. 그룹 정책을 사용하여 사용자의 셸을 "logoff.exe"로 설정하여 컴퓨터의 데스크톱에 액세스하려고하면 즉시 로그 오프되도록하는 등의 어리석은 작업을 수행 할 수 있습니다. 그러나 일반적인 "파일 / 열기"대화 상자를 사용하는 모든 응용 프로그램을 사용하여 서버의 바탕 화면에서 명령 프롬프트 나 다른 프로그램을 열 수 있습니다.

최소 권한의 원칙을 따르고 TS RemoteApp 사용자에게 원하는 소프트웨어를 실행하는 데 필요한 권한을 최소한으로 부여하는 것이 좋습니다. 서버 컴퓨터의 데스크톱에 연결되면 제한된 권한으로 인해 서버 컴퓨터에 손상을 줄 수 있습니다.


알아두면 좋은 점은 소프트웨어는 우리 자신의 것이므로 고객에게 자체 서버가 없어도 소프트웨어를 실행할 수있는 방법을 제공하고 있습니다. 그러나 우리는 단순히 응용 프로그램을 사용하도록 제한하려고합니다. 그 아이디어를 시도하고 어떻게 진행되는지 봅니다.
Brett Allen

이에 대한 정책은 어디에 있습니까? 이러한 응용 프로그램을 호스팅하는 서버의 로컬 보안 정책에서이 작업을 수행 할 수 있습니까? 도메인 수준에서이 작업을 수행해야하는 경우 회사 소유자를 불러 와서 안내해야합니다.
Brett Allen

2
@Aequitarum Custos, 나는 그가 말하고 있다고 생각합니다User Configuration/Policies/Administrative Templates/System/Custom User Interface
Zoredache

1
예상 한 것만 실행할 수 있도록 소프트웨어 제한 정책을 설정하는 것을 잊지 마십시오. (셸을 logoff.exe로 설정하는 경우 +1 : 동일하게 수행하고 권장합니다)
Skyhawk

@Aequitarum 아니요, 도메인 수준에서 수행 할 필요는 없습니다. 한 시스템에 대해서만 로컬로 그룹 정책을 편집하려면 gpedit.msc를 실행하십시오.
Skyhawk

2

Windows 7 또는 Windows 2008 R2를 사용하는 경우 필요한 응용 프로그램이나 스크립트 만 허용하려면 보안 설정에서 "응용 프로그램 제어 정책"을 사용하는 것이 좋습니다.


1

서버 관리자와 명명 된 AD 그룹 만 액세스 할 수 있도록 데스크톱을 잠그기 위해 수행 한 작업입니다. 지정된 AD 그룹의 구성원이 아닌 사용자에게는 데스크톱 / 표준 mstsc가 아니라 RDWeb을 사용하라는 메시지가 표시됩니다.

  1. vbscript를 만들어 모든 사용자가 읽을 수있는 서버의 폴더에 넣습니다.
  2. 다음 줄을 추가하십시오 %windir%\system32\USRLOGON.CMD

    cscript <sourcefolder>\DesktopUserCheck.vbs
    

vbscript 코드 (아래 <> 항목에 개인 정보를 추가하십시오)

'Script created by Tord Bergset, Jan 2014
'This script is called from the file called C:\Windows\System32\USRLOGON.CMD
'The script check if a user logging on to the server desktop is a allowed to do this.
'The string called StrGroupName controls the access group to check for. 
'AD group used for this script = "G WTS Grant Desktop Access"
'---------------------------------------------------------------------------------------

Const strComputer = "."
Const EWX_LOGOFF = 0 

Dim objShell, objWMIService, colProcessList, objNetwork, StrGroupName, strUsername, strUserIsMember, strUserFullName

Set objShell = WScript.CreateObject ("WScript.Shell")
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'userinit.exe'")
Set objNetwork = CreateObject("Wscript.Network")
strUsername = EnvString("username")

' Mention any AD Group Name Here. Also works for Domain Admins, Enterprise Admins etc.
' -------------------------------------------------------------------------------------
StrGroupName = "G WTS Grant Desktop Access"
' -------------------------------------------------------------------------------------

If IsAdmin = 0 Then wscript.Quit

CheckADGroupMembership()

If strUserIsMember = "YES" Then
    ' Do something here if user is a member of the group
    'MsgBox "Is member"
    Wscript.Quit
Else
    ' Do something here if user is NOT a member of the group
    'MsgBox "Is not member" 
    For Each objProcess in colProcessList
        MsgBox "You (" & strUsername & " ) are not allowed to log in to the server desktop." & VBLF & "Please connect through the Remote Desktop Web Page (RDWeb):" & VBLF & VBLF & "<rdweb server address>", vbExclamation + vbSystemModal, strUsername & " - Access Denied !"
        objShell.run "logoff"
        WScript.Quit
    Next    
End If

Wscript.Quit 


' *****************************************************
'This function checks to see if the logged on user has local admin rights
Function IsAdmin()
    With CreateObject("Wscript.Shell")
        IsAdmin = .Run("%comspec% /c OPENFILES > nul", 0, True)
    End With
End Function

' *****************************************************
'This function checks to see if the passed group name contains the current user as a member. Returns True or False
Function IsMember(groupName)
    If IsEmpty(groupListD) then
        Set groupListD = CreateObject("Scripting.Dictionary")
        groupListD.CompareMode = TextCompare
        ADSPath = EnvString("userdomain") & "/" & EnvString("username")
        Set userPath = GetObject("WinNT://" & ADSPath & ",user")
        For Each listGroup in userPath.Groups
            groupListD.Add listGroup.Name, "-"
        Next
    End if
    IsMember = CBool(groupListD.Exists(groupName))
End Function

' *****************************************************
'This function returns a particular environment variable's value.
' for example, if you use EnvString("username"), it would return the value of %username%.
Function EnvString(variable)
    variable = "%" & variable & "%"
    EnvString = objShell.ExpandEnvironmentStrings(variable)
End Function


' *****************************************************
Sub CheckADGroupMembership()
    ' =============================================================
    ' List All Members of a Group; Including Nested Members
    ' =============================================================
    Dim ObjRootDSE, ObjConn, ObjRS, ObjCustom
    Dim StrDomainName, StrGroupName, StrSQL
    Dim StrGroupDN, StrEmptySpace

    strUserIsMember = ""

    Set ObjRootDSE = GetObject("LDAP://RootDSE")
    StrDomainName = Trim(ObjRootDSE.Get("DefaultNamingContext"))
    Set ObjRootDSE = Nothing

    StrSQL = "Select ADsPath From 'LDAP://" & StrDomainName & "' Where ObjectCategory = 'Group' AND Name = '" & StrGroupName & "'"

    Set ObjConn = CreateObject("ADODB.Connection")
    ObjConn.Provider = "ADsDSOObject":  ObjConn.Open "Active Directory Provider"
    Set ObjRS = CreateObject("ADODB.Recordset")
    ObjRS.Open StrSQL, ObjConn
    If ObjRS.EOF Then
        'WScript.Echo VbCrLf & "This Group: " & StrGroupName & " does not exist in Active Directory"
    End If
    If Not ObjRS.EOF Then   
        WScript.Echo vbNullString
        ObjRS.MoveLast: ObjRS.MoveFirst
        'WScript.Echo "Total No of Groups Found: " & ObjRS.RecordCount
        'WScript.Echo "List of Members In " & StrGroupName & " are: " & VbCrLf
        While Not ObjRS.EOF     
            StrGroupDN = Trim(ObjRS.Fields("ADsPath").Value)
            Set ObjCustom = CreateObject("Scripting.Dictionary")
            StrEmptySpace = " "
            GetAllNestedMembers StrGroupDN, StrEmptySpace, ObjCustom
            Set ObjCustom = Nothing
            ObjRS.MoveNext
        Wend
    End If
    ObjRS.Close:    Set ObjRS = Nothing
    ObjConn.Close:  Set ObjConn = Nothing
End Sub

Private Function GetAllNestedMembers (StrGroupADsPath, StrEmptySpace, ObjCustom)
    Dim ObjGroup, ObjMember
    Set ObjGroup = GetObject(StrGroupADsPath)
    For Each ObjMember In ObjGroup.Members      
        'WScript.Echo Trim(ObjMember.CN) & " --- " & Trim(ObjMember.DisplayName) & " (" & Trim(ObjMember.Class) & ")" & " (" & Trim(ObjMember.sAMAccountName) & ")"
        strThisUser = Trim(ObjMember.sAMAccountName)

        If lCase(strUsername) = lCase(strThisUser) Then 
            strUserIsMember = "YES"
            strUserFullName = Trim(ObjMember.DisplayName)
            Exit Function
        End If

        If Strcomp(Trim(ObjMember.Class), "Group", vbTextCompare) = 0 Then
            If ObjCustom.Exists(ObjMember.ADsPath) Then 
                'WScript.Echo StrEmptySpace & " -- Already Checked Group-Member " & "(Stopping Here To Escape Loop)"
            Else
                ObjCustom.Add ObjMember.ADsPath, 1  
                GetFromHere ObjMember.ADsPath, StrEmptySpace & " ", ObjCustom
            End If
        End If
    Next
End Function

Private Sub GetFromHere(StrGroupADsPath, StrEmptySpace, ObjCustom)
    Dim ObjThisGroup, ObjThisMember
    Set ObjThisGroup = GetObject(StrGroupADsPath)
    'WScript.Echo vbNullString
    'WScript.Echo "  ** Members of this Group are:"
    For Each ObjThisMember In ObjThisGroup.Members      
        'WScript.Echo "    >> " & Trim(ObjThisMember.CN) & " --- " & Trim(ObjThisMember.DisplayName) & " (" & Trim(ObjThisMember.Class) & ")" & " (" & Trim(ObjThisMember.sAMAccountName) & ")"
        strThisUser = Trim(ObjThisMember.sAMAccountName)

        If lCase(strUsername) = lCase(strThisUser) Then 
            strUserIsMember = "YES"
            strUserFullName = Trim(ObjThisMember.DisplayName)
            Exit Sub
        End If

    Next
    'WScript.Echo vbNullString
End Sub


0

userinit.exeRemoteApp 세션 이 프로세스를 시작하는 동안 전체 사용자 세션이 프로세스를 시작한다는 사실을 이용할 수 있습니다 rdpshell.exe. userinit.exe표준 사용자가 AppLocker를 실행 하지 못하도록하는 데 AppLocker를 사용할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.