none
Impossible d'utiliser File.SetAccessControl sur des groupes RRS feed

  • Question

  • Bonjour,

    Mon objectif : Permettre au groupe "%COMPUTERNAME%\Users" (XP en version US) un accès total à un fichier se trouvant dans "C:\Windows" (saplogon.ini pour être précis).

    Mon souci : En utilisant cette méthode, je parviens sans soucis à modifier les droits d'un utilisateur, qu'il soit du domaine ou local. Par contre, quand je tente sur le groupe "Users", j'ai le message suivant :

    "System.Security.Principal.IdentityNotMappedException: Some or all identity references could not be translated" suivi de "at System ..."

    Le système d'exploitation est un XP SP3 US mais traduit en FR, par contre les groupes et utilisateurs sont dans la langue US (Users, Administrator, sytem ...), j'ai d'ailleurs bêtement tenté avec "Utilisateurs" mais même message.

    Quelqu'un aurait une idée SVP ?

    Merci, cordialement,

    Cyril

    vendredi 23 septembre 2011 08:42

Réponses

  • Bonjour,

    Pourriez vous nous donner un peu de code histoire que ça soit plus parlant ?
    Avez vous essayer de lister les groupes afin de savoir comment il ce nome ?

    Il me semble pas nécessaire de mettre le nom de domaine quand c'est du local vous devriez essayer de mettre juste "Users" ou "Utilisateurs"

     


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    vendredi 23 septembre 2011 09:30
    Auteur de réponse
  • Cyril,

    Je viens d'essayer le code suivant :

     

    Imports System.Security.Principal
    Imports System.Security.AccessControl
    Imports System.IO

            Dim FileName = "c:\test.xml"
            Dim Users As New SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, Nothing)
            Dim rule As New FileSystemAccessRule(Users, FileSystemRights.Modify, AccessControlType.Allow)
    
            Dim fSecurity As FileSecurity = File.GetAccessControl(FileName)
            fSecurity.AddAccessRule(rule)
            File.SetAccessControl(FileName, fSecurity)
    

    et cela fonctionne sans erreur.
    Pourriez vous essayer ce même code ?

     

    A bientôt

     

     


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn

    • Modifié TroxsaEditor vendredi 23 septembre 2011 13:53
    • Marqué comme réponse Cesame samedi 24 septembre 2011 07:58
    vendredi 23 septembre 2011 13:52
    Auteur de réponse
  • La différence est que son code (comme celui que j'avais posté) utilise directement l'objet "Utilisateurs" qui représente déjà le groupe qui nous intéresse alors que vous essayez de passer Utilisateurs.Value de type string.

    Sur http://msdn.microsoft.com/fr-fr/library/system.security.accesscontrol.filesystemaccessrule.aspx on doit maintenant utiliser le premier constructeur qui accepte un objet (qui représente un groupe) et non plus le deuxième qui accepte une chaine de caractères (le nom du groupe).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Marqué comme réponse Cesame samedi 24 septembre 2011 07:58
    vendredi 23 septembre 2011 15:16
    Modérateur

Toutes les réponses

  • Bonjour,

    Pourriez vous nous donner un peu de code histoire que ça soit plus parlant ?
    Avez vous essayer de lister les groupes afin de savoir comment il ce nome ?

    Il me semble pas nécessaire de mettre le nom de domaine quand c'est du local vous devriez essayer de mettre juste "Users" ou "Utilisateurs"

     


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    vendredi 23 septembre 2011 09:30
    Auteur de réponse
  • Bonjour,

    Je crois comprendre que l'on essaie de créer l'objet qui réprésente ce groupe via son nom. Pour un groupe standard, il est sans doute préférable d'utiliser http://msdn.microsoft.com/en-us/library/system.security.principal.wellknownsidtype.aspx.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    vendredi 23 septembre 2011 09:38
    Modérateur
  • Merci à vous deux pour votre intérêt.

    Voici le code en question :

    Private Sub BSapLogon_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BSapLogon.Click
            Dim fileName As String = "C:\Windows\Saplogon.ini"
            Dim computer As String = Environ("COMPUTERNAME")
            Try
                Dim U As String
                U = computer & "\Users"
                AddFileSecurity(fileName, U, FileSystemRights.FullControl, AccessControlType.Allow)
            Catch msgErr As Exception
                MessageBox.Show(msgErr.Message)
            End Try
            Beep()
        End Sub
    
        Sub AddFileSecurity(ByVal fileName As String, ByVal account As String, ByVal rights As FileSystemRights, ByVal controlType As AccessControlType)
            ' Get a FileSecurity object that represents the current security settings.
            Dim fSecurity As FileSecurity = File.GetAccessControl(fileName)
            ' Add the FileSystemAccessRule to the security settings. 
            Dim accessRule As FileSystemAccessRule = New FileSystemAccessRule(account, rights, controlType)
            fSecurity.AddAccessRule(accessRule)
            ' Set the new access settings.
            File.SetAccessControl(fileName, fSecurity)
        End Sub
    
        Sub RemoveFileSecurity(ByVal fileName As String, ByVal account As String, ByVal rights As FileSystemRights, ByVal controlType As AccessControlType)
            ' Get a FileSecurity object that represents the current security settings.
            Dim fSecurity As FileSecurity = File.GetAccessControl(fileName)
            ' Remove the FileSystemAccessRule from the security settings. 
            fSecurity.RemoveAccessRule(New FileSystemAccessRule(account, rights, controlType))
            ' Set the new access settings.
            File.SetAccessControl(fileName, fSecurity)
        End Sub
    

    Je tente d'apréhender le lien donné par Patrice, merci encore.

    Cyril


    Edit : Xavier, vous avez - encore - raison, le nom du groupe sans le nom d'hôte fonctionne impecablement ! Merci.
    • Modifié Cesame vendredi 23 septembre 2011 10:01 Résolu !
    vendredi 23 septembre 2011 09:48
  • Ou qq chose comme :

      Dim Users As New SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, Nothing)
            Dim rule As New FileSystemAccessRule(Users, FileSystemRights.Modify, AccessControlType.Allow)
    

    qui permettrait de ne pas dépendre du nom du groupe.
     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    vendredi 23 septembre 2011 10:58
    Modérateur
  • @Patrick Scribe,

    Je trouve très intéressant votre lien et votre exemple, je connaissais pas.
    J'ai l'impression avec le code que vous avez donné est que le groupe "Users" hérite de tout les droits sur les systèmes de fichiers (un peux comme l'administrateur) ?

    Si c'est bien ça, je trouve ça pas très "secure". mais tres utile a connaitre ...

     

    @Cyril

    Faire attention quand vous utilisez les variables d'environnement cela pourrais avoir des valeurs inattendu surtout si cette machine est dans un domaine. Privilégiez l'utilisation de :

    My.Computer.Name
    

     

    A bientôt


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn

    • Modifié TroxsaEditor vendredi 23 septembre 2011 12:13 correction
    vendredi 23 septembre 2011 11:19
    Auteur de réponse
  • Ou qq chose comme :

      Dim Users As New SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, Nothing)
            Dim rule As New FileSystemAccessRule(Users, FileSystemRights.Modify, AccessControlType.Allow)
    

    qui permettrait de ne pas dépendre du nom du groupe.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    En effet ce serait idéal surtout que l'on va bientôt migrer en Windows 7 et que les noms des groupes semblent être traduits par la "traduction logicielle".

    Cependant, dans la méthode la chaîne S-1-5-32-545 (même convertie en String) me génère le même message qu'à mon premier message.

    Je remets mon code refait :

    Private Sub BSapLogon_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BSapLogon.Click
            Dim fileName As String = Environ("SAPLOGON_INI_FILE")
            Dim utilisateurs As New SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, Nothing)
            Try
                AddFileSecurity(fileName, utilisateurs.Value, FileSystemRights.FullControl, AccessControlType.Allow)
                Info2.Text = "Accès total sur SapLogon pour les utilisateurs"
            Catch msgErr As Exception
                Info2.Text = msgErr.Message
            End Try
            Beep()
    End Sub
    
    Sub AddFileSecurity(ByVal fileName As String, ByVal account As String, ByVal rights As FileSystemRights, ByVal controlType As AccessControlType)
            ' Get a FileSecurity object that represents the current security settings.
            Dim fSecurity As FileSecurity = File.GetAccessControl(fileName)
            ' Add the FileSystemAccessRule to the security settings. 
            Dim accessRule As FileSystemAccessRule = New FileSystemAccessRule(account, rights, controlType)
            fSecurity.AddAccessRule(accessRule)
            ' Set the new access settings.
            File.SetAccessControl(fileName, fSecurity)
    End Sub
    


    Merci Xavier, j'ai de mauvaises habitudes que je dois corriger, et des bonnes pratiques à apprendre. Pour le coup, je n'ai plus besoin de cette variable.

    Cyril

    vendredi 23 septembre 2011 11:48
  • Non,

    Le contexte est exactement le même que précédemment. On ne donne que les droits que l'on veut et on ne peut les donner que si le compte sous lequel tourne l'appli est lui-même autorisé à donner ces droits.

    Ces deux lignes (insuffisantes en elle-même) étaient juste destinées à montrer comment on peut appliquer une règle à un groupe sans connaître son nom.

    Dans le premier cas, le code ne devrait fonctionner que si le groupe s'appelle "Users" (donc un OS en langue anglaise).

    Dans le second cas, le code devrait fonctionner quelle que soit la langue utilisée pour nommer le groupe "Users" (en se basant en fait sur un identifiant interne qui lui reste inchangée quelle que soit la langue de Windows).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    vendredi 23 septembre 2011 11:56
    Modérateur
  • @Patrick - Merci pour cette échange, que je trouve très instructif.

    @Cyril - Tout le monde a de mauvaise habitude (même moi), mais cela s’arrange avec le temps on n'en apprends tout les jours (la preuve ici)

    A bientôt

     


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    vendredi 23 septembre 2011 12:19
    Auteur de réponse
  • Je reviens à la charge :D.

    Cela fonctionne bien quand je mets "Utilisateurs" sur Windows 7 et "Users" sur les Windows XP dans la Sub AddFileSecurity, mais je préfèrerai que cela tourne indépendamment de la langue comme l'a précisé Patrice.

    En utilisant :

    Dim utilisateurs As New SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, Nothing)

    Lorsque je tente de lancer la Sub dont le code est plus haut :

    AddFileSecurity(fileName, utilisateurs.Value, FileSystemRights.FullControl, AccessControlType.Allow)

    Sur la machine Windows 7 j'ai "Impossible de traduire certaines ou toutes les références d'identité." et sur Windows XP, j'ai le droit à une super moulinette et au message plus flou suivant "La relation d'approbation entre le domaine principal et le domaine approuvé a échoué.".

    Sur Windows 7 il semble que le système ne fasse pas le lien entre SID "S-1-5-32-545" et le groupe "Utilisateurs", existe t-il une conversion ?

    Sur Windows XP, je ne vois pas du tout.

    Cyril

    vendredi 23 septembre 2011 12:47
  • Cyril,

    Je viens d'essayer le code suivant :

     

    Imports System.Security.Principal
    Imports System.Security.AccessControl
    Imports System.IO

            Dim FileName = "c:\test.xml"
            Dim Users As New SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, Nothing)
            Dim rule As New FileSystemAccessRule(Users, FileSystemRights.Modify, AccessControlType.Allow)
    
            Dim fSecurity As FileSecurity = File.GetAccessControl(FileName)
            fSecurity.AddAccessRule(rule)
            File.SetAccessControl(FileName, fSecurity)
    

    et cela fonctionne sans erreur.
    Pourriez vous essayer ce même code ?

     

    A bientôt

     

     


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn

    • Modifié TroxsaEditor vendredi 23 septembre 2011 13:53
    • Marqué comme réponse Cesame samedi 24 septembre 2011 07:58
    vendredi 23 septembre 2011 13:52
    Auteur de réponse
  • La différence est que son code (comme celui que j'avais posté) utilise directement l'objet "Utilisateurs" qui représente déjà le groupe qui nous intéresse alors que vous essayez de passer Utilisateurs.Value de type string.

    Sur http://msdn.microsoft.com/fr-fr/library/system.security.accesscontrol.filesystemaccessrule.aspx on doit maintenant utiliser le premier constructeur qui accepte un objet (qui représente un groupe) et non plus le deuxième qui accepte une chaine de caractères (le nom du groupe).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Marqué comme réponse Cesame samedi 24 septembre 2011 07:58
    vendredi 23 septembre 2011 15:16
    Modérateur
  • Merci Xavier, malheureusement je ne pourrais tester que lundi, je n'ai qu'un XP Familial à la maison et je n'ai pas installé VB.

    En effet Patrice, je restais bloqué sur la seconde construction (car elle avait fonctionné) alors qu'il est clairement indiqué que l'on a le choix, les deux premières parmi les quatre possibles :

    FileSystemAccessRule(IdentityReference, FileSystemRights, AccessControlType)
    FileSystemAccessRule(String, FileSystemRights, AccessControlType)

    Merci à vous deux.

    Cyril

     

    Édition : Je confirme cela fonctionne sans avoir à gérer la langue du groupe, je ne pouvais espérer mieux. Merci encore pour votre aide à vous deux.


    • Modifié Cesame lundi 26 septembre 2011 07:16
    samedi 24 septembre 2011 07:57