Hanya izinkan RemoteApp, bukan Remote Desktop

11

Saya menemukan pertanyaan berikut, dengan premis yang serupa, namun jawaban atas pertanyaan itu, adalah pertanyaan yang diulangi sebagai pernyataan!

RemoteApp Mencegah Pengguna dari Menjalankan Remote Desktop

Bagaimana cara saya mengizinkan RemoteApp tetapi melarang Remote Desktop? Untuk mengizinkan aplikasi jarak jauh, saya tampaknya harus menambahkan pengguna ke grup "Pengguna Desktop Jarak Jauh". Ini memungkinkan Remote Desktop.

Saya mencoba menggunakan grup "TS Web Access Computers", namun ini tidak memberi mereka wewenang untuk menjalankan RemoteApp.

Di mana konfigurasi untuk menonaktifkan Remote Desktop, sementara membiarkan kemampuan RemoteApp tetap utuh?

Brett Allen
sumber
RemoteApp masih TS / RDS; Anda masih harus mengamankan server sama saja.
Chris S
Setuju, meskipun premis layanan kami, adalah mereka hanya diizinkan untuk menggunakan Aplikasi. Mereka tidak diberi login penuh ke desktop untuk mengurangi overhead pada sistem. Jika mereka mengatasinya seperti yang disebutkan Evan, maka kita dapat menangani kasus per kasus. Ini adalah masalah sumber daya, bukan masalah keamanan yang sulit.
Brett Allen

Jawaban:

12

Tidak ada cara "resmi disetujui" untuk melakukan ini karena, pada dasarnya, fungsi RemoteApp TS hanya memanfaatkan kode Remote Desktop yang ada. Anda bisa melakukan sesuatu yang konyol seperti menggunakan Kebijakan Grup untuk mengatur shell pengguna menjadi "logoff.exe" sehingga jika mereka mencoba mengakses desktop mesin mereka akan segera log-off. Namun, aplikasi apa pun yang menggunakan dialog "File / Open" yang umum, dapat digunakan untuk mendapatkan prompt perintah atau program lain yang terbuka di desktop server.

Anda lebih baik memastikan bahwa Anda mengikuti prinsip privilege paling rendah dan memberikan hak pengguna TS RemoteApp Anda sesedikit mungkin karena mereka perlu menjalankan perangkat lunak yang dimaksud. Jika mereka berakhir di desktop komputer server, hak mereka yang dibatasi harus mencegah mereka melakukan apa pun yang merusak komputer server.

Evan Anderson
sumber
Senang mengetahui, perangkat lunak adalah milik kita sendiri, dan kami menyediakan pelanggan cara untuk menjalankannya tanpa memiliki server sendiri. Namun kami mencoba untuk membatasi mereka hanya menggunakan aplikasi. Akan mencoba gagasan itu dan melihat bagaimana kelanjutannya.
Brett Allen
Di mana kebijakan untuk ini berada? Dapatkah saya melakukan ini dalam Kebijakan Keamanan Lokal untuk server yang menampung aplikasi ini? Jika saya perlu melakukan ini di tingkat domain, perlu membawa pemilik perusahaan dan menuntunnya.
Brett Allen
2
@Austitarum Custos, saya yakin dia sedang berbicara tentangUser Configuration/Policies/Administrative Templates/System/Custom User Interface
Zoredache
1
Jangan lupa untuk mengatur kebijakan pembatasan perangkat lunak yang memungkinkan mereka untuk menjalankan hanya apa yang Anda harapkan untuk dijalankan. (+1 untuk pengaturan shell ke logoff.exe: Saya telah melakukan hal yang sama & merekomendasikannya)
Skyhawk
@Aitaritarum Tidak, Anda tidak perlu melakukannya di tingkat domain. Jika Anda ingin mengedit Kebijakan Grup secara lokal untuk satu mesin saja, jalankan saja gpedit.msc.
Skyhawk
2

Lebih baik menggunakan "Kebijakan kontrol aplikasi" di pengaturan keamanan hanya untuk memungkinkan hanya aplikasi atau skrip yang diperlukan jika Anda menggunakan Windows 7 atau Windows 2008 R2

Dmitry Bespalov
sumber
1

Ini yang saya lakukan untuk mengunci Desktop agar hanya dapat diakses oleh administrator server dan grup AD yang bernama. Pengguna yang bukan anggota grup AD yang diberikan akan mendapatkan pesan yang memberitahu mereka untuk menggunakan RDWeb dan bukan Desktop / mstsc standar.

  1. Buat vbscript dan letakkan di folder di server yang dapat dibaca + dieksekusi oleh semua pengguna
  2. Tambahkan baris berikut ke %windir%\system32\USRLOGON.CMD

    cscript <sourcefolder>\DesktopUserCheck.vbs
    

Kode vbscript (silakan tambahkan info pribadi Anda di entri <> di bawah ini)

'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
Tord Bergset
sumber
0

Anda dapat memanfaatkan fakta bahwa sesi pengguna penuh meluncurkan userinit.exeproses sementara sesi RemoteApp meluncurkan rdpshell.exeproses. AppLocker dapat digunakan untuk melarang userinit.exeeksekusi oleh pengguna standar.

Michael Steele
sumber