Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Opracował: Piotr DejaVu Szawdyński
Biblioteki C/C++

ConvertStringSidToSid

[funkcja] Konwertuje identyfikator bezpieczeństwa (SID) z postaci tekstowej do prawidłowego funkcjonalnie SID-a.

Składnia

C/C++
#include <sddl.h>

BOOL WINAPI ConvertStringSidToSid(
LPCTSTR StringSid,
PSID * Sid
);

Argumenty

ArgumentOpis
LPCTSTR StringSidŁańcuch znaków zakończony znakiem terminalnym, zawierający odpowiednio sformatowany SID, który ma zostać przekonwertowany. Przyładowy SID:
C/C++
LPCTSTR sWszyscySID = _T( "S-1-1-0" );
PSID * SidWskaźnik na zmienną typu PSID, która otrzyma wskaźnik na przekonwertowany identyfikator bezpieczeństwa (SID).

Aby zwolnić otrzymany SID należy użyć funkcji LocalFree.

Zwracana wartość

Zwraca wartość różną od zera w przypadku sukcesu. W przeciwnym wypadku funkcja zwraca wartość 0.

Aby uzyskać rozszerzone informacje o błędzie wywołaj funkcję » WinAPIGetLastError.

Funkcja » WinAPIGetLastError może zwrócić jeden z następujących kodów błędów:
Kod błęduOpis błędu
ERROR_INVALID_PARAMETERNieprawidłowa wartość argumentu.
ERROR_INVALID_SIDNieprawidłowy identyfikator bezpieczeństwa (SID).

Opis szczegółowy

Funkcja konwertuje identyfikator bezpieczeństwa (SID) z postaci tekstowej do prawidłowego funkcjonalnie SID-a.

Dodatkowe informacje

Windows 2000 wspiera tylko i wyłącznie standardowy zapis identyfikatora SID, tj. identyfikator bezpieczeństwa musi być zapisany w postaci S-R-I-S-S.

Przykład

C/C++
#include <windows.h>
#include <cstdio>
#include <string>
#include <tchar.h>
#include <aclapi.h>
#include <sddl.h>

DWORD AddAceToObjectsSecurityDescriptor(
LPTSTR pszObjName, // name of object
SE_OBJECT_TYPE ObjectType, // type of object
LPTSTR pszTrustee, // trustee for new ACE
TRUSTEE_FORM TrusteeForm, // format of trustee structure
DWORD dwAccessRights, // access mask for new ACE
ACCESS_MODE AccessMode, // type of ACE
DWORD dwInheritance // inheritance flags for new ACE
)
{
    DWORD dwRes = 0;
    PACL pOldDACL = NULL, pNewDACL = NULL;
    PSECURITY_DESCRIPTOR pSD = NULL;
    EXPLICIT_ACCESS ea;
   
    if( NULL == pszObjName )
         return ERROR_INVALID_PARAMETER;
   
    // Get a pointer to the existing DACL.
   
    dwRes = GetNamedSecurityInfo( pszObjName, ObjectType,
    DACL_SECURITY_INFORMATION,
    NULL, NULL, & pOldDACL, NULL, & pSD );
    if( ERROR_SUCCESS != dwRes ) {
        printf( "GetNamedSecurityInfo Error %u\n", dwRes );
        goto Cleanup;
    }
   
    // Initialize an EXPLICIT_ACCESS structure for the new ACE.
   
    ZeroMemory( & ea, sizeof( EXPLICIT_ACCESS ) );
    ea.grfAccessPermissions = dwAccessRights;
    ea.grfAccessMode = AccessMode;
    ea.grfInheritance = dwInheritance;
    ea.Trustee.TrusteeForm = TrusteeForm;
    ea.Trustee.ptstrName = pszTrustee;
   
    // Create a new ACL that merges the new ACE
    // into the existing DACL.
   
   
    dwRes = SetEntriesInAcl( 1, & ea, pOldDACL, & pNewDACL );
    if( ERROR_SUCCESS != dwRes ) {
        printf( "SetEntriesInAcl Error %u\n", dwRes );
        goto Cleanup;
    }
   
    // Attach the new ACL as the object's DACL.
   
    dwRes = SetNamedSecurityInfo( pszObjName, ObjectType,
    DACL_SECURITY_INFORMATION,
    NULL, NULL, pNewDACL, NULL );
    if( ERROR_SUCCESS != dwRes ) {
        printf( "SetNamedSecurityInfo Error %u\n", dwRes );
        goto Cleanup;
    }
   
    Cleanup:
   
    if( pSD != NULL )
         LocalFree(( HLOCAL ) pSD );
   
    if( pNewDACL != NULL )
         LocalFree(( HLOCAL ) pNewDACL );
   
    return dwRes;
}

BOOL SetPrivilege(
HANDLE hToken, // access token handle
LPCTSTR lpszPrivilege, // name of privilege to enable/disable
BOOL bEnablePrivilege // to enable or disable privilege
)
{
    TOKEN_PRIVILEGES tp;
    LUID luid;
   
    if( !LookupPrivilegeValue(
    NULL, // lookup privilege on local system
    lpszPrivilege, // privilege to lookup
    & luid ) ) // receives LUID of privilege
    {
        printf( "LookupPrivilegeValue error: %u\n", GetLastError() );
        return FALSE;
    }
   
    tp.PrivilegeCount = 1;
    tp.Privileges[ 0 ].Luid = luid;
    if( bEnablePrivilege )
         tp.Privileges[ 0 ].Attributes = SE_PRIVILEGE_ENABLED;
    else
         tp.Privileges[ 0 ].Attributes = 0;
   
    // Enable the privilege or disable all privileges.
   
    if( !AdjustTokenPrivileges(
    hToken,
    FALSE,
    & tp,
    sizeof( TOKEN_PRIVILEGES ),
    ( PTOKEN_PRIVILEGES ) NULL,
    ( PDWORD ) NULL ) )
    {
        printf( "AdjustTokenPrivileges error: %u\n", GetLastError() );
        return FALSE;
    }
   
    if( GetLastError() == ERROR_NOT_ALL_ASSIGNED )
   
    {
        printf( "The token does not have the specified privilege. \n" );
        return FALSE;
    }
   
    return TRUE;
}

int main()
{
    DWORD dwError;
   
    dwError = AddAceToObjectsSecurityDescriptor( _T( "D:\\bumtralala" ),
    SE_FILE_OBJECT,
    _T( "Wszyscy" ),
    TRUSTEE_IS_NAME,
    GENERIC_ALL,
    SET_ACCESS,
    SUB_CONTAINERS_AND_OBJECTS_INHERIT
    );
   
    PSID psid;
    ::ConvertStringSidToSid( _T( "S-1-1-0" ), & psid ); //Równoważne z "Wszyscy"
   
    dwError = AddAceToObjectsSecurityDescriptor( _T( "MACHINE\\Software\\ablabla" ),
    SE_REGISTRY_KEY,
    ( LPTSTR ) psid,
    TRUSTEE_IS_SID,
    STANDARD_RIGHTS_ALL,
    GRANT_ACCESS,
    CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE
    );
    ::LocalFree( psid );
    return 0;
}

Linki zewnętrzne