Comment trouver tous les utilisateurs ayant des autorisations d'accès distant ?

Hey, Scripting Guy!

Hey, Scripting Guy!

Bienvenue dans la rubrique TechNet dans laquelle les Microsoft Scripting Guys répondent aux questions fréquentes sur les scripts d'administration de système. Vous avez une question sur les scripts d'administration de système ? Envoyez-la par courrier électronique à scripter@microsoft.com. Nous ne pouvons pas garantir que nous pourrons répondre à toutes les questions qui nous parviendrons, mais nous vous promettons de faire tout notre possible.

Et pensez à consulter la nouvelle rubrique améliorée Hey, Scripting Guy! archive.

La question du jour : Comment trouver tous les utilisateurs ayant des autorisations d'accès distant ?

Comment trouver tous les utilisateurs ayant des autorisations d'accès distant ?Comment trouver tous les utilisateurs ayant des autorisations d'accès distant ?

Hey, Scripting Guy! Comment trouver tous les utilisateurs ayant des autorisations d'accès distant, c'est-à-dire tous les utilisateurs pour lesquels la propriété Dial-In ou VPN a la valeur Autoriser ?

-- RC

Bonjour, RC. L'homme semble engagé dans une quête sans fin, qu'il s'agisse de l'âme soeur, du bonheur parfait ou du sens de la vie. Nous ne pouvons malheureusement pas vous aider dans ces domaines. (Nous avons cru y arriver pour le sens de la vie, mais en fait, nous avions tort.) Cependant, nous pouvons vous aider à trouver les utilisateurs ayant des autorisations d'accès distant :

On Error Resume Next

Const ADS_SCOPE_SUBTREE = 2

Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection

objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 

objCommand.CommandText = _
    "SELECT Name FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user' " & _
        "AND msNPAllowDialin = TRUE"
Set objRecordSet = objCommand.Execute

objRecordSet.MoveFirst
Do Until objRecordSet.EOF
    Wscript.Echo objRecordSet.Fields("Name").Value
    objRecordSet.MoveNext
Loop

Voici un conseil que nous donnons toujours : chaque fois que vous recherchez quelque chose, commencez votre recherche dans Active Directory. Ce script illustre parfaitement cette recherche. Vous recherchez des utilisateurs pour lesquels l'option Autoriser l'accès est sélectionnée dans l'onglet Appel entrant d'Active Directory.

Autorisations d'accès distant

Il s'avère en fait que l'option Autorisation d'accès distant (appel entrant ou VPN) équivaut à l'attribut msNPAllowDialin dans Active Directory. Si l'accès est autorisé, msNPAllowDialin a la valeur True (Vrai). S'il est refusé, msNPAllowDialin a la valeur False (Faux). Si msNPAllowDialin n'a pas de valeur, cela signifie que l'option Contrôler l'accès via la Stratégie d'accès distant a été sélectionnée.

Autrement dit, pour trouver tous les utilisateurs ayant un accès distant, il nous suffit de rechercher tous les comptes utilisateur pour lesquels l'attribut msNPAllowDialin a la valeur True. Nous n'allons pas nous lancer dans une longue explication du code de recherche dans Active Directory. Tout cela est traité en détail, en deux parties, dans la rubrique Dude, Where's My Printer? de la série Tales from the Script. Nous allons toutefois vous montrer la requête permettant d'extraire ces utilisateurs :

objCommand.CommandText = _
    "SELECT Name FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user' " & _
        "AND msNPAllowDialin = TRUE"

Comme vous pouvez le constater, nous recherchons tous les objets Active Directory dans lesquels objectCategory est égal à utilisateur. (En d'autres termes, nous recherchons des comptes utilisateurs par opposition à des comptes de groupes ou des comptes d'ordinateurs et pour lesquels l'attribut msNPAllowDialin est True.) Si nous voulions obtenir tous les utilisateurs dont l'accès a été refusé, nous rechercherions les comptes dans lesquels msNPAllowDialin a la valeur False :

objCommand.CommandText = _
    "SELECT Name FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user' " & _
        "AND msNPAllowDialin = FALSE"

Et qu'en est-il des utilisateurs qui disposent d'un accès à distance défini par une stratégie ? Dans ce cas, nous pouvons rechercher les utilisateurs pour lesquels l'attribut msNPAllowDialin n'a pas de valeur configurée :

objCommand.CommandText = _
    "SELECT Name FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user' " & _
        "AND msNPAllowDialin <> '*'"

Oui, cela semble un peu bizarre, mais dans ADSI, l'astérisque est un caractère générique qui représente tout. Dans cette requête, nous demandons la liste des utilisateurs pour lesquels la propriété msNPAllowDialin n'équivaut à rien. Autrement dit, nous voulons obtenir les utilisateurs pour lesquels l'attribut msNPAllowDialin n'a pas de valeur. Ceux pour lesquels cet attribut a une autre valeur (True ou False) sont exclus. Cette fois-ci, les utilisateurs renvoyés par cette requête seront des utilisateurs dont l'accès distant est déterminé par une stratégie. (Il s'agit en fait du paramètre par défaut. Si vous n'indiquez pas le contraire, les utilisateurs auront des autorisations d'accès distant définies par une stratégie.)

Vous suivez ? Après avoir récupéré un jeu d'enregistrements des utilisateurs répondant au critère spécifié, nous employons simplement ces lignes de code pour parcourir la liste et renvoyer le nom de chaque utilisateur :

Do Until objRecordSet.EOF
    Wscript.Echo objRecordSet.Fields("Name").Value
    objRecordSet.MoveNext
Loop

Comme indiqué précédemment, la recherche d'une liste d'utilisateurs ayant des autorisations d'accès distant n'a rien à voir avec la quête du sens de la vie. Mais nous aimons croire qu'elle s'en rapproche.

Pour en savoir plus

Consultez la rubrique Hey, Scripting Guy! - Archive