Uzak Masaüstü'ne değil, yalnızca RemoteApp'a izin ver


11

Aşağıdaki soruyu, benzer bir önermeyle buldum, ancak sorunun cevabı, soru bir ifade olarak yeniden ifade edildi!

RemoteApp Kullanıcının Uzak Masaüstü'nü Çalıştırmasını Engelle

RemoteApp'a nasıl izin veririm, ancak Uzak Masaüstü'ne izin vermezim? Uzak uygulamaya izin vermek için, görünüşe göre kullanıcıları "Uzak Masaüstü Kullanıcıları" grubuna eklemek zorundayım. Bu Uzak Masaüstü'ne izin verir.

"TH Web Erişimi Bilgisayarları" grubunu kullanmayı denedim, ancak bu onlara RemoteApp çalıştırma yetkisi vermiyor.

RemoteApp özelliklerini olduğu gibi bırakırken Uzak Masaüstü'nü devre dışı bırakma yapılandırması nerede?


RemoteApp hala TS / RDS'dir; sunucuyu aynı şekilde güvenceye almanız gerekir.
Chris S

Anlaşılan, hizmetimizin öncüsü olsa da, sadece Uygulamayı kullanmalarına izin verilir. Sistemdeki ek yükü azaltmak için masaüstüne tam giriş yapılmaz. Evan'un belirttiği gibi etrafında çalışırlarsa, o zaman bu dava ile başa çıkabiliriz. Bu bir güvenlik sorunu, zor bir güvenlik sorunu değil.
Brett Allen

Yanıtlar:


12

Bunu yapmanın "resmi olarak onaylanmış" bir yolu yoktur, çünkü temel olarak, TH RemoteApp işlevselliği sadece mevcut Uzak Masaüstü kodundan yararlanmaktadır. Kullanıcının kabuğunu "logoff.exe" olarak ayarlamak için Grup İlkesi'ni kullanmak gibi aptalca bir şey yapabilirsiniz, böylece makinenin masaüstüne erişmeye çalışırlarsa hemen oturumu kapatırlar. Bununla birlikte, ortak bir "Dosya / Aç" iletişim kutusu kullanan herhangi bir uygulama, bir komut istemi veya sunucunun masaüstünde açık olan diğer programları almak için kullanılabilir.

En az ayrıcalık ilkesini izlediğinizden ve TS RemoteApp kullanıcılarınıza amaçlanan yazılımı çalıştırmaları için gereken kadar az hak verdiğinizden emin olmak daha iyidir. Sunucu bilgisayarın masaüstünde sonlanırsa, kısıtlı hakları sunucu bilgisayara zarar veren herhangi bir şey yapmalarını engellemelidir.


Bilmek güzel, yazılım bizim ve biz müşterilerine kendi sunucuları olmadan çalıştırmak için bir yol sağlıyoruz. Ancak bunları uygulamayı kullanmakla sınırlandırmaya çalışıyoruz. Bu fikri deneyecek ve nasıl gittiğini görecek.
Brett Allen

Bunun politikası nerededir? Bunu, bu uygulamaları barındıran sunucunun Yerel Güvenlik İlkesi'nde yapabilir miyim? Bunu bir etki alanı düzeyinde yapmam gerekiyorsa, şirketin sahibini getirip onu yürütebilirim.
Brett Allen

2
@Aitaritarum Custos, onun hakkında konuştuğuna inanıyorumUser Configuration/Policies/Administrative Templates/System/Custom User Interface
Zoredache

1
Yalnızca çalışmasını beklediğiniz şeyi çalıştırmalarına izin veren yazılım kısıtlama ilkeleri ayarlamayı unutmayın. (Kabuğu logoff.exe'ye ayarlamak için +1: Aynı şeyi yaptım & öneriyorum)
Skyhawk

@Aequitarum Hayır, bunu etki alanı düzeyinde yapmanız gerekmez. Grup İlkeleri'ni yalnızca tek bir makine için yerel olarak düzenlemek istiyorsanız, gpedit.msc dosyasını çalıştırın.
Skyhawk

2

Güvenlik ayarlarında yalnızca Windows 7 veya Windows 2008 R2 kullanıyorsanız yalnızca gerekli uygulamalara veya komut dosyalarına izin vermek için "Uygulama denetim ilkesi" kullanmak daha iyidir


1

Masaüstünü yalnızca sunucu yöneticileri ve adlandırılmış bir AD grubu için erişilebilir olacak şekilde kilitlemek için yaptığım budur. Belirtilen AD grubunun üyesi olmayan kullanıcılar, Masaüstü / standart mstsc'yi değil, RDWeb'i kullanmalarını bildiren bir ileti alır.

  1. Bir vbscript oluşturun ve bunu sunucuda tüm kullanıcıların okuyabileceği + yürütebileceği bir klasöre koyun
  2. Şu satırı ekle: %windir%\system32\USRLOGON.CMD

    cscript <sourcefolder>\DesktopUserCheck.vbs
    

Vbscript kodu (lütfen aşağıdaki <> girişlere kişisel bilgilerinizi ekleyin)

'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.exeRemoteApp oturumları işlemi başlatırken, tam kullanıcı oturumlarının işlemi başlatmasından yararlanabilirsiniz rdpshell.exe. AppLocker, userinit.exestandart kullanıcılar tarafından yürütülmesini engellemek için kullanılabilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.