IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Le descripteur de sécurité - registre


Sujet :

Windows

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut Le descripteur de sécurité - registre
    Bonjour,

    J'ai plusieurs questions. Tout d'abord, je ne comprends pas pourquoi le compilateur me renvoie l'erreur suivante : 'undefined reference to ConvertSecurityDescriptorToStringSecurityDescriptor' dans le bout de code ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    /*++
    
    Copyright (c) 1997-1998  Microsoft Corporation
    
    Module Name:
    
        sddl.w
    
    Abstract:
    
        This module defines the support and conversions routines necessary for SDDL.
    
    Revision History:
    
    --*/
    
    #ifndef __SDDL_H__
    #define __SDDL_H__
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    //
    // SDDL Version information
    //
    #define SDDL_REVISION_1     1
    #define SDDL_REVISION       SDDL_REVISION_1
    
    //
    // SDDL Component tags
    //
    #define SDDL_OWNER                          TEXT("O")       // Owner tag
    #define SDDL_GROUP                          TEXT("G")       // Group tag
    #define SDDL_DACL                           TEXT("D")       // DACL tag
    #define SDDL_SACL                           TEXT("S")       // SACL tag
    
    //
    // SDDL Security descriptor controls
    //
    #define SDDL_PROTECTED                      TEXT("P")       // DACL or SACL Protected
    #define SDDL_AUTO_INHERIT_REQ               TEXT("AR")      // Auto inherit request
    #define SDDL_AUTO_INHERITED                 TEXT("AI")      // DACL/SACL are auto inherited
    #define SDDL_NULL_ACL                       TEXT("NO_ACCESS_CONTROL")    // Null ACL
    
    //
    // SDDL Ace types
    //
    #define SDDL_ACCESS_ALLOWED                 TEXT("A")   // Access allowed
    #define SDDL_ACCESS_DENIED                  TEXT("D")   // Access denied
    #define SDDL_OBJECT_ACCESS_ALLOWED          TEXT("OA")  // Object access allowed
    #define SDDL_OBJECT_ACCESS_DENIED           TEXT("OD")  // Object access denied
    #define SDDL_AUDIT                          TEXT("AU")  // Audit
    #define SDDL_ALARM                          TEXT("AL")  // Alarm
    #define SDDL_OBJECT_AUDIT                   TEXT("OU")  // Object audit
    #define SDDL_OBJECT_ALARM                   TEXT("OL")  // Object alarm
    #define SDDL_MANDATORY_LABEL                TEXT("ML")  // Integrity label
    #define SDDL_CALLBACK_ACCESS_ALLOWED                 TEXT("XA")   // callback Access allowed
    #define SDDL_CALLBACK_ACCESS_DENIED                  TEXT("XD")   // callback Access denied
    
    //
    // SDDL Ace flags
    //
    #define SDDL_CONTAINER_INHERIT              TEXT("CI")  // Container inherit
    #define SDDL_OBJECT_INHERIT                 TEXT("OI")  // Object inherit
    #define SDDL_NO_PROPAGATE                   TEXT("NP")  // Inherit no propagate
    #define SDDL_INHERIT_ONLY                   TEXT("IO")  // Inherit only
    #define SDDL_INHERITED                      TEXT("ID")  // Inherited
    #define SDDL_AUDIT_SUCCESS                  TEXT("SA")  // Audit success
    #define SDDL_AUDIT_FAILURE                  TEXT("FA")  // Audit failure
    
    
    //
    // SDDL Rights
    //
    #define SDDL_READ_PROPERTY                  TEXT("RP")
    #define SDDL_WRITE_PROPERTY                 TEXT("WP")
    #define SDDL_CREATE_CHILD                   TEXT("CC")
    #define SDDL_DELETE_CHILD                   TEXT("DC")
    #define SDDL_LIST_CHILDREN                  TEXT("LC")
    #define SDDL_SELF_WRITE                     TEXT("SW")
    #define SDDL_LIST_OBJECT                    TEXT("LO")
    #define SDDL_DELETE_TREE                    TEXT("DT")
    #define SDDL_CONTROL_ACCESS                 TEXT("CR")
    #define SDDL_READ_CONTROL                   TEXT("RC")
    #define SDDL_WRITE_DAC                      TEXT("WD")
    #define SDDL_WRITE_OWNER                    TEXT("WO")
    #define SDDL_STANDARD_DELETE                TEXT("SD")
    #define SDDL_GENERIC_ALL                    TEXT("GA")
    #define SDDL_GENERIC_READ                   TEXT("GR")
    #define SDDL_GENERIC_WRITE                  TEXT("GW")
    #define SDDL_GENERIC_EXECUTE                TEXT("GX")
    #define SDDL_FILE_ALL                       TEXT("FA")
    #define SDDL_FILE_READ                      TEXT("FR")
    #define SDDL_FILE_WRITE                     TEXT("FW")
    #define SDDL_FILE_EXECUTE                   TEXT("FX")
    #define SDDL_KEY_ALL                        TEXT("KA")
    #define SDDL_KEY_READ                       TEXT("KR")
    #define SDDL_KEY_WRITE                      TEXT("KW")
    #define SDDL_KEY_EXECUTE                    TEXT("KX")
    #define SDDL_NO_WRITE_UP                    TEXT("NW")
    #define SDDL_NO_READ_UP                     TEXT("NR")
    #define SDDL_NO_EXECUTE_UP                  TEXT("NX")
    
    
    //
    // SDDL User alias max size
    //      - currently, upto two supported eg. "DA"
    //      - modify this if more WCHARs need to be there in future e.g. "DAX"
    //
    
    #define SDDL_ALIAS_SIZE                     2
    
    //
    // SDDL User aliases
    //
    #define SDDL_DOMAIN_ADMINISTRATORS          TEXT("DA")      // Domain admins
    #define SDDL_DOMAIN_GUESTS                  TEXT("DG")      // Domain guests
    #define SDDL_DOMAIN_USERS                   TEXT("DU")      // Domain users
    #define SDDL_ENTERPRISE_DOMAIN_CONTROLLERS  TEXT("ED")      // Enterprise domain controllers
    #define SDDL_DOMAIN_DOMAIN_CONTROLLERS      TEXT("DD")      // Domain domain controllers
    #define SDDL_DOMAIN_COMPUTERS               TEXT("DC")      // Domain computers
    #define SDDL_BUILTIN_ADMINISTRATORS         TEXT("BA")      // Builtin (local ) administrators
    #define SDDL_BUILTIN_GUESTS                 TEXT("BG")      // Builtin (local ) guests
    #define SDDL_BUILTIN_USERS                  TEXT("BU")      // Builtin (local ) users
    #define SDDL_LOCAL_ADMIN                    TEXT("LA")      // Local administrator account
    #define SDDL_LOCAL_GUEST                    TEXT("LG")      // Local group account
    #define SDDL_ACCOUNT_OPERATORS              TEXT("AO")      // Account operators
    #define SDDL_BACKUP_OPERATORS               TEXT("BO")      // Backup operators
    #define SDDL_PRINTER_OPERATORS              TEXT("PO")      // Printer operators
    #define SDDL_SERVER_OPERATORS               TEXT("SO")      // Server operators
    #define SDDL_AUTHENTICATED_USERS            TEXT("AU")      // Authenticated users
    #define SDDL_PERSONAL_SELF                  TEXT("PS")      // Personal self
    #define SDDL_CREATOR_OWNER                  TEXT("CO")      // Creator owner
    #define SDDL_CREATOR_GROUP                  TEXT("CG")      // Creator group
    #define SDDL_LOCAL_SYSTEM                   TEXT("SY")      // Local system
    #define SDDL_POWER_USERS                    TEXT("PU")      // Power users
    #define SDDL_EVERYONE                       TEXT("WD")      // Everyone ( World )
    #define SDDL_REPLICATOR                     TEXT("RE")      // Replicator
    #define SDDL_INTERACTIVE                    TEXT("IU")      // Interactive logon user
    #define SDDL_NETWORK                        TEXT("NU")      // Nework logon user
    #define SDDL_SERVICE                        TEXT("SU")      // Service logon user
    #define SDDL_RESTRICTED_CODE                TEXT("RC")      // Restricted code
    #define SDDL_WRITE_RESTRICTED_CODE          TEXT("WR")      // Write Restricted code
    #define SDDL_ANONYMOUS                      TEXT("AN")      // Anonymous Logon
    #define SDDL_SCHEMA_ADMINISTRATORS          TEXT("SA")      // Schema Administrators
    #define SDDL_CERT_SERV_ADMINISTRATORS       TEXT("CA")      // Certificate Server Administrators
    #define SDDL_RAS_SERVERS                    TEXT("RS")      // RAS servers group
    #define SDDL_ENTERPRISE_ADMINS              TEXT("EA")      // Enterprise administrators
    #define SDDL_GROUP_POLICY_ADMINS            TEXT("PA")      // Group Policy administrators
    #define SDDL_ALIAS_PREW2KCOMPACC            TEXT("RU")      // alias to allow previous windows 2000
    #define SDDL_LOCAL_SERVICE                  TEXT("LS")      // Local service account (for services)
    #define SDDL_NETWORK_SERVICE                TEXT("NS")      // Network service account (for services)
    #define SDDL_REMOTE_DESKTOP                 TEXT("RD")      // Remote desktop users (for terminal server)
    #define SDDL_NETWORK_CONFIGURATION_OPS      TEXT("NO")      // Network configuration operators ( to manage configuration of networking features)
    #define SDDL_PERFMON_USERS                  TEXT("MU")      // Performance Monitor Users
    #define SDDL_PERFLOG_USERS                  TEXT("LU")      // Performance Log Users
    #define SDDL_IIS_USERS                      TEXT("IS")      // Anonymous Internet Users
    #define SDDL_CRYPTO_OPERATORS               TEXT("CY")      // Crypto Operators
    #define SDDL_OWNER_RIGHTS                   TEXT("OW")      // Owner Rights SID
    #define SDDL_EVENT_LOG_READERS              TEXT("ER")      // Event log readers
    #define SDDL_ENTERPRISE_RO_DCs              TEXT("RO")      // Enterprise Read-only domain controllers
    #define SDDL_CERTSVC_DCOM_ACCESS            TEXT("CD")      // Users who can connect to certification authorities using DCOM
    //
    // Integrity Labels
    //
    #define SDDL_ML_LOW                         TEXT("LW")      // Low mandatory level
    #define SDDL_ML_MEDIUM                      TEXT("ME")      // Medium mandatory level
    #define SDDL_ML_MEDIUM_PLUS                 TEXT("MP")      // Medium Plus mandatory level
    #define SDDL_ML_HIGH                        TEXT("HI")      // High mandatory level
    #define SDDL_ML_SYSTEM                      TEXT("SI")      // System mandatory level
    
    //
    // SDDL Seperators - character version
    //
    #define SDDL_SEPERATORC                     TEXT(';')
    #define SDDL_DELIMINATORC                   TEXT(':')
    #define SDDL_ACE_BEGINC                     TEXT('(')
    #define SDDL_ACE_ENDC                       TEXT(')')
    #define SDDL_SPACEC                              TEXT(' ')
    #define SDDL_ACE_COND_BEGINC           TEXT('(')
    #define SDDL_ACE_COND_ENDC           TEXT(')')
    #define SDDL_ACE_COND_STRING_BEGINC           TEXT('"')
    #define SDDL_ACE_COND_STRING_ENDC           TEXT('"')
    #define SDDL_ACE_COND_COMPOSITEVALUE_BEGINC       TEXT('{')
    #define SDDL_ACE_COND_COMPOSITEVALUE_ENDC           TEXT('}')
    #define SDDL_ACE_COND_COMPOSITEVALUE_SEPERATORC           TEXT(',')
    #define SDDL_ACE_COND_BLOB_PREFIXC          TEXT('#')
    #define SDDL_ACE_COND_SID_BEGINC           TEXT('(')
    #define SDDL_ACE_COND_SID_ENDC           TEXT(')')
    
    //
    // SDDL Seperators - string version
    //
    #define SDDL_SEPERATOR                     TEXT(";")
    #define SDDL_DELIMINATOR                   TEXT(":")
    #define SDDL_ACE_BEGIN                     TEXT("(")
    #define SDDL_ACE_END                       TEXT(")")
    #define SDDL_ACE_COND_BEGIN           TEXT("(")
    #define SDDL_ACE_COND_END           TEXT(")")
    #define SDDL_SPACE                              TEXT(" ")
    #define SDDL_ACE_COND_BLOB_PREFIX          TEXT("#")
    #define SDDL_ACE_COND_SID_PREFIX          TEXT("SID")
    
    
    #if !defined(_NTDDK_)
    
    #if(_WIN32_WINNT >= 0x0500)
    
    BOOL
    WINAPI
    ConvertSidToStringSidA(
        __in  PSID     Sid,
        __deref_out LPSTR  *StringSid
        );
    BOOL
    WINAPI
    ConvertSidToStringSidW(
        __in  PSID     Sid,
        __deref_out LPWSTR  *StringSid
        );
    #ifdef UNICODE
    #define ConvertSidToStringSid  ConvertSidToStringSidW
    #else
    #define ConvertSidToStringSid  ConvertSidToStringSidA
    #endif // !UNICODE
    
    BOOL
    WINAPI
    ConvertStringSidToSidA(
        __in LPCSTR   StringSid,
        __deref_out PSID   *Sid
        );
    BOOL
    WINAPI
    ConvertStringSidToSidW(
        __in LPCWSTR   StringSid,
        __deref_out PSID   *Sid
        );
    #ifdef UNICODE
    #define ConvertStringSidToSid  ConvertStringSidToSidW
    #else
    #define ConvertStringSidToSid  ConvertStringSidToSidA
    #endif // !UNICODE
    
    BOOL
    WINAPI
    ConvertStringSecurityDescriptorToSecurityDescriptorA(
        __in  LPCSTR StringSecurityDescriptor,
        __in  DWORD StringSDRevision,
        __deref_out PSECURITY_DESCRIPTOR  *SecurityDescriptor,
        __out_opt PULONG  SecurityDescriptorSize
        );
    BOOL
    WINAPI
    ConvertStringSecurityDescriptorToSecurityDescriptorW(
        __in  LPCWSTR StringSecurityDescriptor,
        __in  DWORD StringSDRevision,
        __deref_out PSECURITY_DESCRIPTOR  *SecurityDescriptor,
        __out_opt PULONG  SecurityDescriptorSize
        );
    #ifdef UNICODE
    #define ConvertStringSecurityDescriptorToSecurityDescriptor  ConvertStringSecurityDescriptorToSecurityDescriptorW
    #else
    #define ConvertStringSecurityDescriptorToSecurityDescriptor  ConvertStringSecurityDescriptorToSecurityDescriptorA
    #endif // !UNICODE
    
    
    BOOL WINAPI
    ConvertSecurityDescriptorToStringSecurityDescriptorA(
        __in  PSECURITY_DESCRIPTOR  SecurityDescriptor,
        __in  DWORD RequestedStringSDRevision,
        __in  SECURITY_INFORMATION SecurityInformation,
        __deref_out LPSTR  *StringSecurityDescriptor,
        __out_opt ULONG StringSecurityDescriptorLen
        );
    BOOL WINAPI
    ConvertSecurityDescriptorToStringSecurityDescriptorW(
        __in  PSECURITY_DESCRIPTOR  SecurityDescriptor,
        __in  DWORD RequestedStringSDRevision,
        __in  SECURITY_INFORMATION SecurityInformation,
        __deref_out LPWSTR  *StringSecurityDescriptor,
        __out_opt ULONG StringSecurityDescriptorLen
        );
    #ifdef UNICODE
    #define ConvertSecurityDescriptorToStringSecurityDescriptor  ConvertSecurityDescriptorToStringSecurityDescriptorW
    #else
    #define ConvertSecurityDescriptorToStringSecurityDescriptor  ConvertSecurityDescriptorToStringSecurityDescriptorA
    #endif // !UNICODE
    
    #endif /* _WIN32_WINNT >=  0x0500 */
    
    #endif /* !defined(_NTDDK_) */
    
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif  // endif __SDDL_H__
    
    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    #include <tchar.h>
    
    int main ()
    {
      HKEY                                  hKey;
      DWORD                                 retCode;
      PSECURITY_DESCRIPTOR                  pSD;
      PSECURITY_DESCRIPTOR_CONTROL          pCtrl;
      DWORD                                 cbSD;
      BOOL                                  bDaclPresent;
      ACL                                   *pacl;
      BOOL                                  bDaclDefaulted;
      DWORD                                 dwRev;
      LPTSTR                                StrSD;
      ULONG                                 StrSDSize;
    
      retCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS, &hKey);
      if (retCode == ERROR_SUCCESS)
        {
          retCode = RegGetKeySecurity(hKey, DACL_SECURITY_INFORMATION|OWNER_SECURITY_INFORMATION, 0, &cbSD);
          pSD = malloc(cbSD);
          retCode = RegGetKeySecurity(hKey, DACL_SECURITY_INFORMATION|OWNER_SECURITY_INFORMATION, pSD, &cbSD);
          if (retCode == ERROR_SUCCESS)
             {
                ConvertSecurityDescriptorToStringSecurityDescriptor(pSD, SDDL_REVISION_1, DACL_SECURITY_INFORMATION, 0, &StrSDSize);
                StrSD = malloc(StrSDSize+1);
                ConvertSecurityDescriptorToStringSecurityDescriptor(pSD, SDDL_REVISION_1, DACL_SECURITY_INFORMATION, StrSD, &StrSDSize);
                if (retCode != 0)
                 {
                    printf("StrSD = %s\n", StrSD);
                 }
             }
         }
    
      return (0);
    }
    Sinon, à votre avis, faut-il mieux passer par les fonctions ConvertSecurityDescriptorToStringSecurityDescriptor et ConvertStringSecurityDescriptorToSecurityDescriptor pour manipuler la DACL d'une clé de registre ou utiliser les autres fonctions, comme GetSecurityDescriptorDacl, GetAce etc.

    Merci par avance pour vos réponses.


  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Moi ce que je ne comprends pas c'est pourquoi tu ne mets pas tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <windows.h>
    #include <sddl.h>
    ...
    Au lieu de ce copier-coller manuel de sddl.h et à la mauvaise place en plus. Pour les fonctions, ça dépend des paramètres (arguments) que tu connais et/ou que tu veux utiliser donc dans ton cas ConvertSecurityDescriptorToStringSecurityDescriptor.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Moi ce que je ne comprends pas c'est pourquoi tu ne mets pas tout simplement :
    Ben parce que ça ne marchait pas

    Je me suis rendu compte que je n'avais pas "linker" advapi32.lib.

    J'ai codeblocks comme IDE. J'ai essayé de linker la dll depuis 4h sans succès, je n'y arrive pas... J'ai ouvert un sujet à ce propos dans le forum approprié : http://www.developpez.net/forums/d86...e/#post4942352

    Là je suis totalement perdu, j'arrive pas à faire le "linkage"

    edit:

    #include <windows.h>
    #include <sddl.h>
    Voilà ce que j'obtiens donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    #include <tchar.h>
    #include <Sddl.h>
    
    int main ()
    {
      HKEY                                  hKey;
      DWORD                                 retCode;
      PSECURITY_DESCRIPTOR                  pSD;
      DWORD                                 cbSD;
      LPTSTR                                StrSD;
      PULONG                                pStrSDSize;
    
      retCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS, &hKey);
      if (retCode == ERROR_SUCCESS)
        {
          retCode = RegGetKeySecurity(hKey, DACL_SECURITY_INFORMATION|OWNER_SECURITY_INFORMATION, 0, &cbSD);
          pSD = malloc(cbSD);
          retCode = RegGetKeySecurity(hKey, DACL_SECURITY_INFORMATION|OWNER_SECURITY_INFORMATION, pSD, &cbSD);
          if (retCode == ERROR_SUCCESS)
            {
              ConvertSecurityDescriptorToStringSecurityDescriptor(pSD, SDDL_REVISION_1, DACL_SECURITY_INFORMATION, 0, pStrSDSize);
              StrSD = malloc(*pStrSDSize+1);
              ConvertSecurityDescriptorToStringSecurityDescriptor(pSD, SDDL_REVISION_1, DACL_SECURITY_INFORMATION, StrSD, pStrSDSize);
              if (retCode != 0)
                {
                  printf("StrSD = %s\n", StrSD);
                }
            }
        }
    
      return (0);
    }
    Avec toujours cette erreur : 'undefined reference to ConvertSecurityDescriptorToStringSecurityDescriptor'

    On m'a dit de linker advapi32.dll, mais je n'y arrive pas et ce que je ne comprends pas, c'est que je n'ai pas eu besoin de linker pour les api win32 concernant le registre... ce qui me laisse perplexe.

    Merci

  4. #4
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Dans C::B tu fais un clic droit sur le projet, tu vas dans Project Build Options, Linker, et tu ajoutes advapi32. Puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define _WIN32_WINNT 0x0500
    #include <windows.h>
    #include <sddl.h>
    ...
    #define _WIN32_WINNT 0x0500 indique aux fichiers d'en-tête Windows d'inclure les déclarations/définitions spécifiques à Windows 2000 (et d'exclure les déclarations/définitions non supportées ...), puisque la fonction que tu utilises n'est disponible qu'à partir de Windows 2000 (Windows NT 5.0).

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Re,

    J'obtiens le message d'erreur d'erreur suivant lorsque je veux compiler et lancer le programme :


    -------------- Build: Debug in ACls ---------------

    Linking console executable: bin\Debug\ACls.exe
    mingw32-g++.exe: advapi32: No such file or directory
    Process terminated with status 1 (0 minutes, 0 seconds)
    0 errors, 0 warnings
    Par contre, je n'ai plus le 'undefined reference', mais impossible d'obtenir un exécutable quoi... j'ai passé mon aprem dessus sans succès.

    Un screen : http://img683.imageshack.us/img683/4802/linker2.jpg

    Merci de m'aider.

    edit:

    Je viens de voir ton edit : j'ai rajouté le define comme conseillé, mais j'obtiens tout un lot d'erreurs à la compilation... à cause de cette ligne dans le header visiblement "#if(_WIN32_WINNT >= 0x0500)".

  6. #6
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    J'comprends pas, chez moi ça marche. Essaie d'autres trucs quoi ! advapi32.lib, libadvapi32.a, etc.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Melem Voir le message
    J'comprends pas, chez moi ça marche. Essaie d'autres trucs quoi ! advapi32.lib, libadvapi32.a, etc.
    C'est dingue ça ! J'ai passé toute l'aprem à faire ça, environ 5 bonne heures...

    Et le gagnant est... libadvapi32.a

    Pff... un peu frustrant... mais bon content d'avoir résolu le problème.

    Merci de t'être penché encore une fois sur l'un de mes problèmes et surtout d'avoir eu une bonne intuition.



    edit:

    Dernière question : J'ai téléchargé la SDK aujourd'hui, mais la version que j'ai est visiblement pour windows 7. Y a-t-il plusieurs versions téléchargeables de la SDK ?

  8. #8
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    SDK pour Windows 7 signifie surtout que le SDK tient compte des nouveautés de Windows 7, pas que le SDK ne peut être utilisé que sur ou pour Windows 7. M'enfin, voici le lien vers la page de téléchargement du dernier SDK pré-Vista : Windows® Server 2003 SP1 Platform SDK

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Oki, c'est donc bien ce qu'il me semblait.

    Ce qui est sûr, c'est que le problème venait du header sddl.h contenu dans la dernière version de la SDK, puisque j'ai pris un autre header, légèrement plus ancien, et plus de souci.

    J'essayerais de voir ce qui ne va pas.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    J'ai quelques questions encore, si tu acceptes d'y répondre

    http://msdn.microsoft.com/en-us/libr...66(VS.85).aspx

    J'ai encore du mal à visualiser le type de ce genre de donnée. Voilà ce que je pense avoir compris, corrige-moi si je me trompe :

    - Déjà le type est WORD, pour unsigned short il me semble. C'est donc codé sur 2 bytes, soit 16 bits.
    - Chaque bit prend pour valeur 0 ou 1 et selon le chiffre, le "flag" est "activé" ou non.

    Mettons que je prenne : 0000 0000 0000 0110. Le premier '1' correspondrait au 2ième bit, le deuxième '1' au troisième et ainsi de suite.

    Ce que j'aimerais comprendre, c'est comment savoir, à partir du WORD retourné par une fonction, par exemple, que le flag SE_DACL_PRESENT est présent ou non ? J'ai bien compris qu'il y a un histoire au niveau des bits, mais je n'arrive pas à cerner plus précisément.

    J'espère que ma question est suffisamment claire.

    Et ce principe de codage des données semble récurrent : il en va de même pour les SID etc.

    Merci

  11. #11
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Il faut utiliser les opérateurs de manipulation de bits, regarde par ici par exemple.

    Alors si tu as bien compris le fonctionnement de l'opérateur &, tu devrais comprendre également que tester un ou des bits se fait avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (word & SE_DACL_PRESENT == SE_DACL_PRESENT)
    {
       /* si les bits à 1 de SE_DACL_PRESENT sont tous à 1 dans word ... */
    }

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    J'ai déjà eu l'occasion de manipuler les bits, donc je cerne le principe et l'intérêt.

    Et je crois avoir compris ton exemple...

    Je vais tester tout ça demain, merci beaucoup.

    Bonne nuit

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Re,

    Ouep j'ai bien compris le truc. Par contre, tu avais oublié des parenthèses, j'ai dû en rajouter J'arrive maintenant à récupérer la presque quasi-totalité des informations contenues dans une DALC appartenant à n'importe quelle clé de registre.

    Il me reste à obtenir le nom du groupe pour lequel un ace s'applique, comme <AUTORITE NT\ SYSTEM> ou <PC-de-MonsieurX\Administrateur>.

    Il me semble qu'il faut obtenir la structure TRUSTEE, mais je ne vois pas comment le faire. Pour le moment j'arrive à récupérer la structure du SID correspondant à l'ace, mais je n'arrive pas à obtenir la structure TRUSTEE de cette ace.

    Merci

    edit: J'ai finalement décidé de ne pas utiliser la fonction ConvertSecurityDescriptorToStringSecurityDescriptor pour obtenir les informations du descripteur de sécurité : je passe donc par les différentes fonctions nécessaires.


    edit2 : Trouvé, fallait utiliser LookupAccountSid.

    Bon je crois que tout est ok. J'arrive à exporter et à mettre en forme toute les informations contenues dans une dacl.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Je me permets de continuer dans ce sujet :

    Je ne comprends pas pourquoi count vaut toujours 0 après l'appel à GetExplicitEntriesFromAcl. Je tiens à préciser que mon pointeur pAcl est valide puisqu'il marche avec les autres fonctions. Qui plus est, GetExplicitEntriesFromAcl me retourne ERROR_SUCCESS.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
              ULONG                      count = 0;
              EXPLICIT_ACCESS       *ea;
    
              retCode = GetExplicitEntriesFromAcl(pAcl, &count, &ea);
              if (retCode != ERROR_SUCCESS)
                printf("GetExplicitEntriesFromAcl() failed with STATUS = 0x%08x\n", retCode);
    
              for (i = 0; i < count; i++)
                {
                  printf("Trustee name : %s\n", ea[i].Trustee.ptstrName);
                }
    Des idées ?

    Merci.

  15. #15
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Et tu n'obtiens pas un warning ?

    Citation Envoyé par MSDN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DWORD WINAPI GetExplicitEntriesFromAcl(
        PACL pacl,
        PULONG pcCountOfExplicitEntries,
        PEXPLICIT_ACCESS *pListOfExplicitEntries
    );
    Il faut ensuite utiliser LocalFree pour libérer le tableau de EXPLICIT_ACCESS créé par la fonction.

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Heu... J'ai regardé des exemples sur le net, je vois toujours cette fonction utilisée comme ça :

    Soit PEXPLICIT_ACCESS pListOfExplicitEntries, soit EXPLICIT_ACCESS *pListOfExplicitEntries, mais jamais PEXPLICIT_ACCESS *pListOfExplicitEntries... d'où mon incompréhension.

    Je vais continuer à chercher. J'ai un peu du mal à visualiser le pointeur sur pointeur aussi, peut-être pour ça que j'ai du mal.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
              ULONG                 count = 0;
              PEXPLICIT_ACCESS      *ea;
    
              retCode = GetExplicitEntriesFromAcl(pAcl, &count, ea);
              if (retCode != ERROR_SUCCESS)
                printf("GetExplicitEntriesFromAcl() failed with STATUS = 0x%08x\n", retCode);
    
              printf("count = %d\n", count);
    
              for (i = 0; i < count; i++)
                {
                  printf("Trustee name : %s\n", ea[i]->Trustee.ptstrName);
                }
    Ca ne marche pas mieux. Je dois me tromper... encore un peu du mal avec tous ces pointeurs...


  17. #17
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Lorsqu'une fonction doit "retourner" une valeur, que cette valeur soit une adresse ou autre chose, son prototype est soit du type type func(void) soit du type void func(type *). Ici GetExplicitEntriesFromAcl retourne un PEXPLICIT_ACCESS (adresse d'un EXPLICIT_ACCESS) en utilisant la deuxième forme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
              ULONG                 count = 0;
              PEXPLICIT_ACCESS      ea;
    
              retCode = GetExplicitEntriesFromAcl(pAcl, &count, &ea);
              if (retCode != ERROR_SUCCESS)
                printf("GetExplicitEntriesFromAcl() failed with STATUS = 0x%08x\n", retCode);
    
              printf("count = %d\n", count);
    
              for (i = 0; i < count; i++)
                {
                  printf("Trustee name : %s\n", ea[i].Trustee.ptstrName);
                }
              LocalFree(ea);

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Oki.

    Cependant, count vaut toujours 0 chez moi...

    Bizarre ; j'ai beau chercher, impossible de trouver comment récupérer les structures EA.

  19. #19
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Montre comment as-tu créé et rempli ta structure ACL.

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Bah je pense que ma structure ACL est correcte vu que ça marche avec les autres fonctions comme GetAce. Mais je te montre comment j'ai créé et rempli cette structure, j'ai dû rater quelque chose ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
              // DACL informations
    
              BOOL                          bDaclPresent;
              PACL                          pAcl = NULL;
              BOOL                          bDaclDefaulted;
    
              retCode = GetSecurityDescriptorDacl(pSD, &bDaclPresent, &pAcl, &bDaclDefaulted);
              printf("   #-- HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Run --#\n\n\n");
              if (retCode != 0)
                {
                  printf("DACL informations :\n");
                  printf("   Number of ACE = %d \n", pAcl->AceCount);
                  printf("   Revision = %d\n", pAcl->AclRevision);
                  printf("   AclSize = %d\n\n", pAcl->AclSize);
                }
    Merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Descripteur de sécurité pour createjobobject
    Par lecuye_j dans le forum Windows
    Réponses: 2
    Dernier message: 03/09/2014, 13h53
  2. Réponses: 0
    Dernier message: 29/12/2010, 10h45
  3. Sécurité et autorisation dans la base de registre
    Par Kaneda Shotaro dans le forum C#
    Réponses: 2
    Dernier message: 12/09/2009, 13h51
  4. Enlever la police sécurité du registre apres déconect dom
    Par devlopassion dans le forum Windows
    Réponses: 1
    Dernier message: 06/01/2009, 15h07
  5. Réponses: 2
    Dernier message: 18/01/2008, 23h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo