Chỉ cho phép RemoteApp, không phải Remote Desktop


11

Tôi tìm thấy câu hỏi sau đây, với một tiền đề tương tự, tuy nhiên câu trả lời cho câu hỏi, là câu hỏi được nhắc lại như một tuyên bố!

RemoteApp Ngăn người dùng chạy Remote Desktop

Làm cách nào để cho phép RemoteApp nhưng không cho phép Remote Desktop? Để cho phép ứng dụng từ xa, tôi dường như phải thêm người dùng vào nhóm "Người dùng máy tính từ xa". Điều này cho phép Remote Desktop.

Tôi đã thử sử dụng nhóm "Máy tính truy cập web TS", tuy nhiên điều này không cho phép họ chạy RemoteApp.

Cấu hình để tắt Remote Desktop ở đâu, trong khi vẫn giữ nguyên các khả năng của RemoteApp?


RemoteApp vẫn là TS / RDS; bạn vẫn phải bảo mật máy chủ như cũ.
Chris S

Đồng ý, mặc dù tiền đề của dịch vụ của chúng tôi là họ chỉ được phép sử dụng Ứng dụng. Họ không được đăng nhập đầy đủ vào máy tính để bàn để giảm chi phí trên hệ thống. Nếu họ làm việc xung quanh nó như Evan đề cập, thì chúng ta có thể giải quyết từng trường hợp đó. Đây là một vấn đề tài nguyên, không phải là một vấn đề bảo mật khó khăn.
Brett Allen

Câu trả lời:


12

Không có cách "chính thức bị xử phạt" để làm điều này bởi vì, về cơ bản, chức năng TS RemoteApp chỉ là tận dụng mã Remote Desktop hiện có. Bạn có thể làm điều gì đó ngớ ngẩn như sử dụng Chính sách nhóm để đặt shell của người dùng thành "logoff.exe" sao cho nếu họ cố truy cập vào máy tính để bàn của máy thì họ sẽ bị đăng xuất ngay lập tức. Tuy nhiên, bất kỳ ứng dụng nào sử dụng hộp thoại "Tệp / Mở" chung có thể được sử dụng để nhận dấu nhắc lệnh hoặc các chương trình khác mở trên màn hình của máy chủ.

Tốt hơn hết là bạn nên đảm bảo rằng bạn tuân thủ nguyên tắc ít đặc quyền nhất và cung cấp cho người dùng TS RemoteApp của bạn ít quyền nhất khi họ cần chạy phần mềm dự định. Nếu chúng kết thúc trên máy tính để bàn của máy chủ thì các quyền bị hạn chế của chúng sẽ ngăn chúng làm bất cứ điều gì làm hỏng máy tính của máy chủ.


Điều tốt để biết, phần mềm là của riêng chúng tôi và chúng tôi đang cung cấp cho khách hàng một cách để chạy nó mà không cần có máy chủ của riêng họ. Tuy nhiên, chúng tôi đang cố gắng hạn chế sử dụng ứng dụng. Sẽ thử ý tưởng đó và xem nó diễn ra như thế nào.
Brett Allen

Chính sách này nằm ở đâu? Tôi có thể làm điều này trong Chính sách bảo mật cục bộ cho máy chủ lưu trữ các ứng dụng này không? Nếu tôi cần làm điều này ở cấp tên miền, cần phải đưa chủ sở hữu của công ty và hướng dẫn anh ta vượt qua nó.
Brett Allen

2
@Aequitarum Custos, tôi tin rằng anh ấy đã nói vềUser Configuration/Policies/Administrative Templates/System/Custom User Interface
Zoredache

1
Đừng quên thiết lập các chính sách hạn chế phần mềm cho phép chúng chỉ chạy những gì bạn đang mong đợi chúng chạy. (+1 để đặt shell thành logoff.exe: Tôi cũng đã làm như vậy & khuyên dùng nó)
Skyhawk

@Aequitarum Không, bạn không cần phải làm điều đó ở cấp tên miền. Nếu bạn muốn chỉnh sửa Chính sách nhóm cục bộ chỉ cho một máy, chỉ cần chạy gpedit.msc.
Skyhawk

2

Tốt hơn là sử dụng "Chính sách kiểm soát ứng dụng" trong cài đặt bảo mật chỉ để cho phép các ứng dụng hoặc tập lệnh cần thiết nếu bạn sử dụng Windows 7 hoặc Windows 2008 R2


1

Đây là những gì tôi đã làm để khóa Desktop để chỉ có thể truy cập được đối với người quản trị máy chủ và nhóm AD có tên. Người dùng không phải là thành viên của nhóm AD cụ thể sẽ nhận được thông báo yêu cầu họ sử dụng RDWeb chứ không phải Desktop / mstsc tiêu chuẩn.

  1. Tạo một vbscript và đặt nó vào một thư mục trên máy chủ mà tất cả người dùng có thể đọc + thực thi
  2. Thêm dòng sau vào %windir%\system32\USRLOGON.CMD

    cscript <sourcefolder>\DesktopUserCheck.vbs
    

Mã vbscript (vui lòng thêm thông tin cá nhân của bạn vào các mục <> bên dưới)

'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

Bạn có thể tận dụng thực tế là các phiên người dùng đầy đủ khởi chạy userinit.exequy trình trong khi các phiên RemoteApp khởi chạy rdpshell.exequy trình. AppLocker có thể được sử dụng để cấm userinit.exengười dùng chuẩn thực thi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.