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

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

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

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

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

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



답변

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

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


답변

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


답변

서버 관리자와 명명 된 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


답변

remoteapps WS2008 TS 서비스를 실행 하십시오. 이 클라이언트는 다음과 같습니다. http://www.thinomenon.com/downloads/thinrdc-0.2.8.rar

잘 작동


답변

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


답변