Administración de permisos de cuenta
LSA proporciona varias funciones a las que las aplicaciones pueden llamar para enumerar o establecer privilegios para las cuentas de usuario, grupo y grupo local.
Para poder administrar la información de la cuenta, la aplicación debe obtener un identificador para el objeto Policy local, como se muestra en Apertura de un identificador de objeto de directiva. Además, para enumerar o editar permisos para una cuenta, debe tener el identificador de seguridad (SID) de esa cuenta. La aplicación puede encontrar un SID según el nombre de la cuenta, tal como se describe en Traducción entre nombres y SID.
Para acceder a todas las cuentas que tienen un permiso determinado, llame a LsaEnumerateAccountsWithUserRight. Esta función rellena una matriz con los SID de todas las cuentas que tienen el permiso especificado.
Después de obtener el SID de una cuenta, puede modificar sus permisos. Llame a LsaAddAccountRights para agregar permisos a la cuenta. Si la cuenta especificada no existe, LsaAddAccountRights la crea. Para quitar permisos de una cuenta, llame a LsaRemoveAccountRights. Si quita todos los permisos de una cuenta, LsaRemoveAccountRights también elimina la cuenta.
La aplicación puede comprobar los permisos asignados actualmente a una cuenta llamando a LsaEnumerateAccountRights. Esta función rellena una matriz de estructuras LSA_UNICODE_STRING . Cada estructura contiene el nombre de un privilegio mantenido por la cuenta especificada.
En el ejemplo siguiente se agrega el permiso SeServiceLogonRight a una cuenta. En este ejemplo, la variable AccountSID especifica el SID de la cuenta. Para obtener más información sobre cómo buscar un SID de cuenta, vea Traducción entre nombres y SID.
#include <windows.h>
#include <ntsecapi.h>
void AddPrivileges(PSID AccountSID, LSA_HANDLE PolicyHandle)
{
LSA_UNICODE_STRING lucPrivilege;
NTSTATUS ntsResult;
// Create an LSA_UNICODE_STRING for the privilege names.
if (!InitLsaString(&lucPrivilege, L"SeServiceLogonRight"))
{
wprintf(L"Failed InitLsaString\n");
return;
}
ntsResult = LsaAddAccountRights(
PolicyHandle, // An open policy handle.
AccountSID, // The target SID.
&lucPrivilege, // The privileges.
1 // Number of privileges.
);
if (ntsResult == STATUS_SUCCESS)
{
wprintf(L"Privilege added.\n");
}
else
{
wprintf(L"Privilege was not added - %lu \n",
LsaNtStatusToWinError(ntsResult));
}
}
En el ejemplo anterior, la función InitLsaString convierte una cadena Unicode en una estructura LSA_UNICODE_STRING . El código de esta función se muestra en Uso de cadenas Unicode de LSA.