📄 privileges.c
字号:
/********************************************************************* get a list of all privleges for all sids the in list*********************************************************************/BOOL get_privileges_for_sids(SE_PRIV *privileges, DOM_SID *slist, int scount){ SE_PRIV mask; int i; BOOL found = False; se_priv_copy( privileges, &se_priv_none ); for ( i=0; i<scount; i++ ) { /* don't add unless we actually have a privilege assigned */ if ( !get_privileges( &slist[i], &mask ) ) continue; DEBUG(5,("get_privileges_for_sids: sid = %s\nPrivilege set:\n", sid_string_static(&slist[i]))); dump_se_priv( DBGC_ALL, 5, &mask ); se_priv_add( privileges, &mask ); found = True; } return found;}/********************************************************************* travseral functions for privilege_enumerate_accounts*********************************************************************/static int priv_traverse_fn(TDB_CONTEXT *t, TDB_DATA key, TDB_DATA data, void *state){ PRIV_SID_LIST *priv = state; int prefixlen = strlen(PRIVPREFIX); DOM_SID sid; fstring sid_string; /* easy check first */ if ( data.dsize != sizeof(SE_PRIV) ) return 0; /* check we have a PRIV_+SID entry */ if ( strncmp(key.dptr, PRIVPREFIX, prefixlen) != 0) return 0; /* check to see if we are looking for a particular privilege */ if ( !se_priv_equal(&priv->privilege, &se_priv_none) ) { SE_PRIV mask; se_priv_copy( &mask, (SE_PRIV*)data.dptr ); /* if the SID does not have the specified privilege then just return */ if ( !is_privilege_assigned( &mask, &priv->privilege) ) return 0; } fstrcpy( sid_string, &key.dptr[strlen(PRIVPREFIX)] ); /* this is a last ditch safety check to preventing returning and invalid SID (i've somehow run into this on development branches) */ if ( strcmp( "S-0-0", sid_string ) == 0 ) return 0; if ( !string_to_sid(&sid, sid_string) ) { DEBUG(0,("travsersal_fn_enum__acct: Could not convert SID [%s]\n", sid_string)); return 0; } add_sid_to_array( NULL, &sid, &priv->sids.list, &priv->sids.count ); return 0;}/********************************************************************* Retreive list of privileged SIDs (for _lsa_enumerate_accounts()*********************************************************************/NTSTATUS privilege_enumerate_accounts(DOM_SID **sids, int *num_sids){ TDB_CONTEXT *tdb = get_account_pol_tdb(); PRIV_SID_LIST priv; ZERO_STRUCT(priv); se_priv_copy( &priv.privilege, &se_priv_none ); tdb_traverse( tdb, priv_traverse_fn, &priv); /* give the memory away; caller will free */ *sids = priv.sids.list; *num_sids = priv.sids.count; return NT_STATUS_OK;}/*************************************************************************** Add privilege to sid****************************************************************************/BOOL grant_privilege(const DOM_SID *sid, const SE_PRIV *priv_mask){ SE_PRIV old_mask, new_mask; ZERO_STRUCT( old_mask ); ZERO_STRUCT( new_mask ); if ( get_privileges( sid, &old_mask ) ) se_priv_copy( &new_mask, &old_mask ); else se_priv_copy( &new_mask, &se_priv_none ); se_priv_add( &new_mask, priv_mask ); DEBUG(10,("grant_privilege: %s\n", sid_string_static(sid))); DEBUGADD( 10, ("original privilege mask:\n")); dump_se_priv( DBGC_ALL, 10, &old_mask ); DEBUGADD( 10, ("new privilege mask:\n")); dump_se_priv( DBGC_ALL, 10, &new_mask ); return set_privileges( sid, &new_mask );}/********************************************************************* Add a privilege based on its name*********************************************************************/BOOL grant_privilege_by_name(DOM_SID *sid, const char *name){ int i; for ( i=0; !se_priv_equal(&privs[i].se_priv, &se_priv_end); i++ ) { if ( strequal(privs[i].name, name) ) { return grant_privilege( sid, &privs[i].se_priv ); } } DEBUG(3, ("grant_privilege_by_name: No Such Privilege Found (%s)\n", name)); return False;}/*************************************************************************** Remove privilege from sid****************************************************************************/BOOL revoke_privilege(const DOM_SID *sid, const SE_PRIV *priv_mask){ SE_PRIV mask; /* if the user has no privileges, then we can't revoke any */ if ( !get_privileges( sid, &mask ) ) return True; DEBUG(10,("revoke_privilege: %s\n", sid_string_static(sid))); DEBUGADD( 10, ("original privilege mask:\n")); dump_se_priv( DBGC_ALL, 10, &mask ); se_priv_remove( &mask, priv_mask ); DEBUGADD( 10, ("new privilege mask:\n")); dump_se_priv( DBGC_ALL, 10, &mask ); return set_privileges( sid, &mask );}/********************************************************************* Revoke all privileges*********************************************************************/BOOL revoke_all_privileges( DOM_SID *sid ){ return revoke_privilege( sid, &se_priv_all );}/********************************************************************* Add a privilege based on its name*********************************************************************/BOOL revoke_privilege_by_name(DOM_SID *sid, const char *name){ int i; for ( i=0; !se_priv_equal(&privs[i].se_priv, &se_priv_end); i++ ) { if ( strequal(privs[i].name, name) ) { return revoke_privilege( sid, &privs[i].se_priv ); } } DEBUG(3, ("revoke_privilege_by_name: No Such Privilege Found (%s)\n", name)); return False;}/*************************************************************************** Retrieve the SIDs assigned to a given privilege****************************************************************************/NTSTATUS privilege_create_account(const DOM_SID *sid ){ return ( grant_privilege(sid, &se_priv_none) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL);}/**************************************************************************** initialise a privilege list and set the talloc context ****************************************************************************/ NTSTATUS privilege_set_init(PRIVILEGE_SET *priv_set){ TALLOC_CTX *mem_ctx; ZERO_STRUCTP( priv_set ); mem_ctx = talloc_init("privilege set"); if ( !mem_ctx ) { DEBUG(0,("privilege_set_init: failed to initialize talloc ctx!\n")); return NT_STATUS_NO_MEMORY; } priv_set->mem_ctx = mem_ctx; return NT_STATUS_OK;}/**************************************************************************** initialise a privilege list and with someone else's talloc context ****************************************************************************/NTSTATUS privilege_set_init_by_ctx(TALLOC_CTX *mem_ctx, PRIVILEGE_SET *priv_set){ ZERO_STRUCTP( priv_set ); priv_set->mem_ctx = mem_ctx; priv_set->ext_ctx = True; return NT_STATUS_OK;}/**************************************************************************** Free all memory used by a PRIVILEGE_SET****************************************************************************/void privilege_set_free(PRIVILEGE_SET *priv_set){ if ( !priv_set ) return; if ( !( priv_set->ext_ctx ) ) talloc_destroy( priv_set->mem_ctx ); ZERO_STRUCTP( priv_set );}/**************************************************************************** duplicate alloc luid_attr ****************************************************************************/NTSTATUS dup_luid_attr(TALLOC_CTX *mem_ctx, LUID_ATTR **new_la, LUID_ATTR *old_la, int count){ int i; if ( !old_la ) return NT_STATUS_OK; *new_la = TALLOC_ARRAY(mem_ctx, LUID_ATTR, count); if ( !*new_la ) { DEBUG(0,("dup_luid_attr: failed to alloc new LUID_ATTR array [%d]\n", count)); return NT_STATUS_NO_MEMORY; } for (i=0; i<count; i++) { (*new_la)[i].luid.high = old_la[i].luid.high; (*new_la)[i].luid.low = old_la[i].luid.low; (*new_la)[i].attr = old_la[i].attr; } return NT_STATUS_OK;}/**************************************************************************** Does the user have the specified privilege ? We only deal with one privilege at a time here.*****************************************************************************/BOOL user_has_privileges(NT_USER_TOKEN *token, const SE_PRIV *privilege){ if ( !token ) return False; return is_privilege_assigned( &token->privileges, privilege );}/**************************************************************************** Does the user have any of the specified privileges ? We only deal with one privilege at a time here.*****************************************************************************/BOOL user_has_any_privilege(NT_USER_TOKEN *token, const SE_PRIV *privilege){ if ( !token ) return False; return is_any_privilege_assigned( &token->privileges, privilege );}/**************************************************************************** Convert a LUID to a named string****************************************************************************/char* luid_to_privilege_name(const LUID *set){ static fstring name; int i; if (set->high != 0) return NULL; for ( i=0; !se_priv_equal(&privs[i].se_priv, &se_priv_end); i++ ) { if ( set->low == privs[i].luid.low ) { fstrcpy( name, privs[i].name ); return name; } } return NULL;}/******************************************************************* return the number of elements in the privlege array*******************************************************************/int count_all_privileges( void ){ static int count; if ( count ) return count; /* loop over the array and count it */ for ( count=0; !se_priv_equal(&privs[count].se_priv, &se_priv_end); count++ ) ; return count;}/**************************************************************************************************************************************/BOOL se_priv_to_privilege_set( PRIVILEGE_SET *set, SE_PRIV *mask ){ int i; uint32 num_privs = count_all_privileges(); LUID_ATTR luid; luid.attr = 0; luid.luid.high = 0; for ( i=0; i<num_privs; i++ ) { if ( !is_privilege_assigned(mask, &privs[i].se_priv) ) continue; luid.luid = privs[i].luid; if ( !privilege_set_add( set, luid ) ) return False; } return True;}/**************************************************************************************************************************************/static BOOL luid_to_se_priv( LUID *luid, SE_PRIV *mask ){ int i; uint32 num_privs = count_all_privileges(); for ( i=0; i<num_privs; i++ ) { if ( luid->low == privs[i].luid.low ) { se_priv_copy( mask, &privs[i].se_priv ); return True; } } return False;}/**************************************************************************************************************************************/BOOL privilege_set_to_se_priv( SE_PRIV *mask, PRIVILEGE_SET *privset ){ int i; ZERO_STRUCTP( mask ); for ( i=0; i<privset->count; i++ ) { SE_PRIV r; /* sanity check for invalid privilege. we really only care about the low 32 bits */ if ( privset->set[i].luid.high != 0 ) return False; if ( luid_to_se_priv( &privset->set[i].luid, &r ) ) se_priv_add( mask, &r ); } return True;}/**************************************************************************************************************************************/BOOL is_privileged_sid( DOM_SID *sid ){ SE_PRIV mask; return get_privileges( sid, &mask );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -