Autoriser uniquement RemoteApp, pas Remote Desktop

11

J'ai trouvé la question suivante, avec une prémisse similaire, mais la réponse à la question, était la question reformulée comme une déclaration!

RemoteApp empêche l'utilisateur d'exécuter Remote Desktop

Comment autoriser RemoteApp mais interdire Remote Desktop? Afin d'autoriser l'application à distance, je dois apparemment devoir ajouter les utilisateurs au groupe "Utilisateurs du Bureau à distance". Cela permet Remote Desktop.

J'ai essayé d'utiliser le groupe «Ordinateurs TS Web Access», mais cela ne leur donne pas le droit d'exécuter RemoteApp.

Où est la configuration pour désactiver le Bureau à distance, tout en laissant les capacités de RemoteApp intactes?

Brett Allen
la source
RemoteApp est toujours TS / RDS; vous devez toujours sécuriser le serveur de la même façon.
Chris S
D'accord, bien que la prémisse de notre service, est qu'ils ne sont autorisés à utiliser l'application. Ils ne reçoivent pas une connexion complète au bureau pour réduire les frais généraux sur le système. S'ils y travaillent comme Evan le mentionne, alors nous pouvons traiter ce cas par cas. C'est un problème de ressources, pas un problème de sécurité difficile.
Brett Allen

Réponses:

12

Il n'y a pas de façon "officiellement approuvée" de le faire car, fondamentalement, la fonctionnalité TS RemoteApp exploite simplement le code Remote Desktop existant. Vous pouvez faire quelque chose de stupide comme utiliser la stratégie de groupe pour définir le shell de l'utilisateur sur "logoff.exe" de telle sorte que s'il tentait d'accéder au bureau de la machine, il serait immédiatement déconnecté. Toute application qui utilise une boîte de dialogue "Fichier / Ouvrir" commune, cependant, peut être utilisée pour obtenir une invite de commande ou d'autres programmes ouverts sur le bureau du serveur.

Vous feriez mieux de vous assurer que vous suivez le principe du moindre privilège et accordez à vos utilisateurs TS RemoteApp autant de droits que nécessaire pour exécuter le logiciel prévu. S'ils se retrouvent sur le bureau de l'ordinateur serveur, leurs droits restreints devraient les empêcher de faire quoi que ce soit d'endommager l'ordinateur serveur.

Evan Anderson
la source
Bon à savoir, le logiciel est le nôtre et nous offrons aux clients un moyen de l'exécuter sans avoir leur propre serveur. Cependant, nous essayons de les limiter à une simple utilisation de l'application. Va essayer cette idée et voir comment ça se passe.
Brett Allen
Où se situe la politique en la matière? Puis-je le faire dans la politique de sécurité locale pour le serveur hébergeant ces applications? Si je dois le faire au niveau du domaine, je dois faire venir le propriétaire de l'entreprise et le guider.
Brett Allen
2
@Aequitarum Custos, je crois qu'il parlait deUser Configuration/Policies/Administrative Templates/System/Custom User Interface
Zoredache
1
N'oubliez pas de définir des stratégies de restriction logicielle qui leur permettent d'exécuter uniquement ce que vous attendez d'eux. (+1 pour avoir défini le shell sur logoff.exe: j'ai fait la même chose et je le recommande)
Skyhawk
@Aequitarum Non, vous n'avez pas besoin de le faire au niveau du domaine. Si vous souhaitez modifier les stratégies de groupe localement pour une seule machine, exécutez simplement gpedit.msc.
Skyhawk
2

Il est préférable d'utiliser la «politique de contrôle des applications» dans les paramètres de sécurité uniquement pour autoriser uniquement les applications ou scripts nécessaires si vous utilisez Windows 7 ou Windows 2008 R2

Dmitry Bespalov
la source
1

C'est ce que j'ai fait pour verrouiller le bureau pour qu'il ne soit accessible qu'aux administrateurs de serveur et à un groupe AD nommé. Les utilisateurs qui ne sont pas membres du groupe AD donné recevront un message leur disant d'utiliser le RDWeb et non le Desktop / mstsc standard.

  1. Créez un vbscript et placez-le dans un dossier sur le serveur que tous les utilisateurs peuvent lire + exécuter
  2. Ajoutez la ligne suivante à %windir%\system32\USRLOGON.CMD

    cscript <sourcefolder>\DesktopUserCheck.vbs
    

Le code vbscript (veuillez ajouter vos informations personnelles dans les entrées <> ci-dessous)

'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
la source
0

Vous pouvez profiter du fait que les sessions utilisateur complètes lancent le userinit.exeprocessus tandis que les sessions RemoteApp lancent le rdpshell.exeprocessus. AppLocker peut être utilisé pour interdire userinit.exeson exécution par des utilisateurs standard.

Michael Steele
la source