Дозволити лише RemoteApp, а не віддалений робочий стіл


11

Я знайшов наступне запитання з аналогічною передумовою, проте відповідь на це питання було переосмислено як твердження!

RemoteApp Заважає користувачу запускати віддалений робочий стіл

Як дозволити RemoteApp, але заборонити віддалений робочий стіл? Щоб дозволити віддалений додаток, я, мабуть, повинен додати користувачів до групи "Користувачі віддаленого робочого столу". Це дозволяє віддалений робочий стіл.

Я спробував використати групу "TS Web Access Computers", однак це не дає їм повноважень на запуск RemoteApp.

Де знаходиться конфігурація для відключення віддаленого робочого столу, залишаючи недоторканими можливості RemoteApp?


RemoteApp все ще TS ​​/ RDS; Ви все одно повинні захистити сервер так само.
Chris S

Погоджено, хоча вони є передумовою нашої послуги, чи дозволяється їм використовувати лише Додаток. Вони не отримують повного входу на робочий стіл, щоб зменшити накладні витрати в системі. Якщо вони обійдуться навколо цього, як згадує Еван, то ми можемо розібратися з цим випадком. Це питання ресурсів, а не питання безпеки.
Бретт Аллен

Відповіді:


12

Існує не "офіційно санкціонований" спосіб зробити це, оскільки, по суті, функціональність TS RemoteApp - це лише використання існуючого коду віддаленого робочого столу. Ви можете зробити щось нерозумно, як використовувати групову політику, щоб встановити оболонку користувача на "logoff.exe" таким чином, що якщо вони спробують отримати доступ до робочого столу машини, вони негайно вийдуть із системи. Будь-яка програма, яка використовує загальне діалогове вікно "Файл / Відкрити", може бути використана для отримання командного рядка або інших програм, відкритих на робочому столі сервера.

Вам краще переконатися, що ви дотримуєтесь принципу найменших привілеїв і надаєте своїм користувачам TS RemoteApp як мінімум прав, необхідних для запуску програмного забезпечення, яке планується. Якщо вони потрапляють на робочий стіл серверного комп’ютера, їх обмежені права повинні заважати робити якісь збитки для серверного комп'ютера.


Добре знати, що програмне забезпечення є власним, і ми надаємо клієнтам спосіб запустити його, не маючи власного сервера. Однак ми намагаємось обмежити їх просто використанням програми. Спробую цю ідею і побачити, як вона йде.
Бретт Аллен

Де розміщена політика щодо цього? Чи можу я це зробити в локальній політиці безпеки для сервера, що розміщує ці програми? Якщо мені потрібно зробити це на рівні домену, потрібно залучити власника компанії та пройти його через нього.
Бретт Аллен

2
@Aequitarum Custos, я вважаю, що він говорив проUser Configuration/Policies/Administrative Templates/System/Custom User Interface
Zoredache

1
Не забудьте встановити політику обмеження програмного забезпечення, яка дозволяє їм виконувати лише те, що ви очікуєте від їх запуску. (+1 для встановлення оболонки на logoff.exe: я зробив те саме і рекомендую)
Skyhawk

@Aequitarum Ні, вам не потрібно робити це на рівні домену. Якщо ви хочете редагувати групову політику локально лише для однієї машини, просто запустіть gpedit.msc.
Skyhawk

2

Краще використовувати "Політику управління додатками" в налаштуваннях безпеки, щоб дозволити використовувати лише необхідні програми або сценарії, якщо ви використовуєте Windows 7 або Windows 2008 R2


1

Це я зробив, щоб заблокувати робочий стіл, щоб він був доступний лише адміністраторам серверів та іменованій групі AD. Користувачі, які не є членом даної групи AD, отримають повідомлення про те, що вони повинні використовувати RDWeb, а не робочий / стандартний mstsc.

  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.exeпроцес, а сеанси RemoteApp - запускає rdpshell.exeпроцес. AppLocker можна використовувати для заборони userinit.exeвиконання стандартними користувачами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.