Erlaube nur RemoteApp, nicht Remote Desktop

11

Ich fand die folgende Frage mit einer ähnlichen Prämisse, jedoch war die Antwort auf die Frage die Frage, die als Aussage umformuliert wurde!

RemoteApp Verhindert, dass Benutzer Remotedesktop ausführen

Wie erlaube ich RemoteApp, verbiete aber Remotedesktop? Um eine Remote-App zuzulassen, muss ich die Benutzer anscheinend zur Gruppe "Remotedesktopbenutzer" hinzufügen. Dies ermöglicht Remotedesktop.

Ich habe versucht, die Gruppe "TS Web Access Computers" zu verwenden, dies gibt ihnen jedoch nicht die Berechtigung, RemoteApp auszuführen.

Wo ist die Konfiguration zum Deaktivieren von Remotedesktop, während die RemoteApp-Funktionen intakt bleiben?

Brett Allen
quelle
RemoteApp ist immer noch TS / RDS. Sie müssen den Server trotzdem sichern.
Chris S
Einverstanden ist, obwohl die Voraussetzung unseres Dienstes ist, dass sie nur die Anwendung verwenden dürfen. Sie erhalten keine vollständige Anmeldung am Desktop, um den Overhead auf dem System zu reduzieren. Wenn sie es umgehen, wie Evan es erwähnt, können wir uns von Fall zu Fall darum kümmern. Dies ist ein Ressourcenproblem, kein schwieriges Sicherheitsproblem.
Brett Allen

Antworten:

12

Es gibt keine "offiziell genehmigte" Möglichkeit, dies zu tun, da die TS RemoteApp-Funktionalität im Wesentlichen nur den vorhandenen Remotedesktopcode nutzt. Sie könnten etwas Dummes tun, z. B. Gruppenrichtlinien verwenden, um die Shell des Benutzers auf "logoff.exe" zu setzen, sodass sie sofort abgemeldet werden, wenn sie versuchen, auf den Desktop des Computers zuzugreifen. Jede Anwendung, die ein allgemeines Dialogfeld "Datei / Öffnen" verwendet, kann verwendet werden, um eine Eingabeaufforderung oder andere Programme auf dem Desktop des Servers zu öffnen.

Stellen Sie besser sicher, dass Sie dem Prinzip der geringsten Berechtigungen folgen und Ihren TS RemoteApp-Benutzern so wenig Rechte einräumen, wie sie zum Ausführen der beabsichtigten Software benötigen. Wenn sie auf dem Desktop des Servercomputers landen, sollten ihre eingeschränkten Rechte verhindern, dass sie den Servercomputer beschädigen.

Evan Anderson
quelle
Gut zu wissen, dass die Software unsere eigene ist und wir unseren Kunden die Möglichkeit bieten, sie ohne eigenen Server auszuführen. Wir versuchen jedoch, sie auf die einfache Verwendung der Anwendung zu beschränken. Ich werde diese Idee versuchen und sehen, wie es geht.
Brett Allen
Wo befindet sich die Richtlinie dafür? Kann ich dies in der lokalen Sicherheitsrichtlinie für den Server tun, auf dem diese Anwendungen gehostet werden? Wenn ich dies auf Domain-Ebene tun muss, muss ich den Eigentümer des Unternehmens hinzuziehen und ihn durch das Unternehmen führen.
Brett Allen
2
@Aequitarum Custos, ich glaube, er sprach überUser Configuration/Policies/Administrative Templates/System/Custom User Interface
Zoredache
1
Vergessen Sie nicht, Richtlinien für Softwareeinschränkungen festzulegen, mit denen sie nur das ausführen können, was Sie von ihnen erwarten. (+1 für das Setzen der Shell auf logoff.exe: Ich habe das gleiche getan und empfehle es)
Skyhawk
@Aequitarum Nein, Sie müssen dies nicht auf Domänenebene tun. Wenn Sie Gruppenrichtlinien nur für einen Computer lokal bearbeiten möchten, führen Sie einfach gpedit.msc aus.
Skyhawk
2

Es ist besser, "Anwendungssteuerungsrichtlinie" in den Sicherheitseinstellungen zu verwenden, um nur die erforderlichen Anwendungen oder Skripts zuzulassen, wenn Sie Windows 7 oder Windows 2008 R2 verwenden

Dmitry Bespalov
quelle
1

Dies habe ich getan, um den Desktop so zu sperren, dass nur Serveradministratoren und eine benannte AD-Gruppe darauf zugreifen können. Benutzer, die nicht Mitglied der angegebenen AD-Gruppe sind, erhalten eine Nachricht, in der sie aufgefordert werden, das RDWeb und nicht das Desktop- / Standard-mstsc zu verwenden.

  1. Erstellen Sie ein vbscript und legen Sie es in einem Ordner auf dem Server ab, den alle Benutzer lesen und ausführen können
  2. Fügen Sie die folgende Zeile hinzu %windir%\system32\USRLOGON.CMD

    cscript <sourcefolder>\DesktopUserCheck.vbs
    

Der vbscript-Code (bitte geben Sie Ihre persönlichen Daten in die folgenden <> Einträge ein)

'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
quelle
0

Sie können die Tatsache nutzen, dass vollständige Benutzersitzungen den userinit.exeProzess starten , während RemoteApp-Sitzungen den rdpshell.exeProzess starten . AppLocker kann verwendet werden, um userinit.exedie Ausführung durch Standardbenutzer zu verhindern.

Michael Steele
quelle