Delen via


Beveiligings-id

Windows gebruikt de beveiligings-id (SID) als de definitieve waarde om beveiligingsentiteiten van elkaar te onderscheiden. Een unieke beveiligings-id wordt bijvoorbeeld toegewezen aan elk nieuw account dat is gemaakt voor afzonderlijke gebruikers in het systeem. Voor een bestandssysteem wordt alleen deze SID gebruikt.

In de volgende afbeelding ziet u de structuur van de beveiligings-id.

diagram waarin de structuur van de beveiligings-id wordt geïllustreerd.

Naast unieke SID's definieert het Windows-systeem een set bekende id's. De lokale Administrator is bijvoorbeeld een bekende SID.

Windows biedt een in-kernelmechanisme voor het converteren tussen SID's en gebruikersnamen in de kernelomgeving. Deze functieaanroepen zijn beschikbaar via het ksecdd-stuurprogramma , waarmee deze functies worden geïmplementeerd met behulp van helperservices in de gebruikersmodus. Daarom moet het gebruik binnen bestandssystemen voldoen aan de gebruikelijke regels voor communicatie met services in de gebruikersmodus. Deze aanroepen kunnen niet worden gebruikt tijdens paginabestand-I/O.

Enkele van deze functies zijn:

  • SecMakeSPN maakt een tekenreeks voor de naam van de serviceprovider die kan worden gebruikt bij het communiceren met specifieke beveiligingsserviceproviders.

  • SecMakeSPNEx is een uitgebreide versie van SecMakeSPN die is geïntroduceerd in Windows XP.

  • SecMakeSPNEx2 is een uitgebreide versie van SecMakeSPNEx die beschikbaar is vanaf Windows Vista en Windows Server 2008.

  • SecLookupAccountSid retourneert een accountnaam voor een opgegeven SID.

  • SecLookupAccountName haalt de SID op voor een opgegeven accountnaam.

  • SecLookupWellKnownSid retourneert de juiste SID voor een opgegeven bekende SID-type. Deze functie is beschikbaar in Windows Server 2003 en hoger.

Bovendien kan elk kernelstuurprogramma een SID maken met behulp van de volgende standaardruntimebibliotheekroutines:

  • RtlInitializeSid initialiseert een buffer voor een nieuwe SID.

  • RtlLengthSid bepaalt de grootte van de SID die in de opgegeven buffer is opgeslagen.

  • RtlValidSid bepaalt of de opgegeven SID-buffer een geldige opgemaakte buffer is.

RtlLengthSid en RtlValidSid gaan ervan uit dat de vaste header van 8 bytes voor een SID aanwezig is. Daarom moet een stuurprogramma controleren op deze minimale lengte voor een SID-header voordat deze functies worden aangeroepen.

Hoewel er verschillende andere RTL-functies zijn, biedt deze lijst de primaire functies die nodig zijn bij het maken van een SID.

In het volgende codevoorbeeld ziet u hoe u een SID maakt voor de entiteit 'lokaal systeem'. De eenvoudigere SecLookupWellKnownSid-functie die is geïntroduceerd in Windows Server 2003, kan ook worden gebruikt.

{
    //
    // temporary stack-based storage for an SID
    //
    UCHAR sidBuffer[128];
    PISID localSid = (PISID) sidBuffer;
    SID_IDENTIFIER_AUTHORITY localSidAuthority = 
        SECURITY_NT_AUTHORITY;

    //
    // build the local system SID
    //
    RtlZeroMemory(sidBuffer, sizeof(sidBuffer));
 
    localSid->Revision = SID_REVISION;
    localSid->SubAuthorityCount = 1;
    localSid->IdentifierAuthority = localSidAuthority;
    localSid->SubAuthority[0] = SECURITY_LOCAL_SYSTEM_RID;
 
    //
    // make sure it is valid
    //
    if (!RtlValidSid(localSid)) {
        DbgPrint("no dice - SID is invalid\n");
        return(1);
    }
}

In het volgende codevoorbeeld ziet u hoe u een SID maakt met behulp van de functie SecLookupWellKnownSid voor de entiteit 'lokaal systeem':

{
    UCHAR sidBuffer[128];
    PISID localSid = (PISID) sidBuffer;
    SIZE_T sidSize;
    status = SecLookupWellKnownSid(WinLocalSid,
                                   &localSid,
                                   sizeof(sidBuffer),
                                   &sidSize);

    if (!NT_SUCCESS(status)) {
      //
      // error handling
      //
    }
  }

Een van deze methoden is geldig, hoewel de laatste code de voorkeur heeft. In deze codevoorbeelden worden lokale buffers gebruikt voor het opslaan van de SID. Deze buffers kunnen niet worden gebruikt buiten de huidige oproepcontext. Als de SID-buffer persistent moet zijn, moet de buffer worden toegewezen vanuit het geheugen van de pool.