示例#1
0
NTSTATUS
SamrSrvCreateUser2(
    IN  handle_t         hBinding,
    IN  DOMAIN_HANDLE    hDomain,
    IN  UNICODE_STRING  *pAccountName,
    IN  DWORD            dwAccountFlags,
    IN  DWORD            dwAccessMask,
    OUT ACCOUNT_HANDLE  *phUser,
    OUT PDWORD           pdwAccessGranted,
    OUT PDWORD           pdwRid
    )
{
    NTSTATUS ntStatus = STATUS_SUCCESS;
    PDOMAIN_CONTEXT pDomCtx = NULL;

    pDomCtx = (PDOMAIN_CONTEXT)hDomain;

    if (pDomCtx == NULL || pDomCtx->Type != SamrContextDomain)
    {
        ntStatus = STATUS_INVALID_HANDLE;
        BAIL_ON_NTSTATUS_ERROR(ntStatus);
    }

    if (!(pDomCtx->dwAccessGranted & DOMAIN_ACCESS_CREATE_USER))
    {
        ntStatus = STATUS_ACCESS_DENIED;
        BAIL_ON_NTSTATUS_ERROR(ntStatus);
    }

    ntStatus = SamrSrvCreateAccount(hBinding,
                                    hDomain,
                                    pAccountName,
                                    DS_OBJECT_CLASS_USER,
                                    dwAccountFlags,
                                    dwAccessMask,
                                    phUser,
                                    pdwAccessGranted,
                                    pdwRid);
    BAIL_ON_NTSTATUS_ERROR(ntStatus);

cleanup:
    return ntStatus;

error:
    *phUser           = NULL;
    *pdwAccessGranted = 0;
    *pdwRid           = 0;

    goto cleanup;
}
NTSTATUS
SamrSrvCreateDomAlias(
    /* [in] */ handle_t hBinding,
    /* [in] */ DOMAIN_HANDLE hDomain,
    /* [in] */ UNICODE_STRING *pAliasName,
    /* [in] */ UINT32 dwAccessMask,
    /* [out] */ ACCOUNT_HANDLE *phAlias,
    /* [out] */ UINT32 *pdwRid
    )
{
    NTSTATUS ntStatus = STATUS_SUCCESS;
    PDOMAIN_CONTEXT pDomCtx = NULL;
    PWSTR pwszAliasName = NULL;
    UNICODE_STRING Name = {0};
    UINT32 ulAccessGranted = 0;

    pDomCtx = (PDOMAIN_CONTEXT)hDomain;

    if (pDomCtx == NULL || pDomCtx->Type != SamrContextDomain)
    {
        ntStatus = STATUS_INVALID_HANDLE;
        BAIL_ON_NTSTATUS_ERROR(ntStatus);
    }

    if (!(pDomCtx->dwAccessGranted & DOMAIN_ACCESS_CREATE_ALIAS))
    {
        ntStatus = STATUS_ACCESS_DENIED;
        BAIL_ON_NTSTATUS_ERROR(ntStatus);
    }

    ntStatus = SamrSrvGetFromUnicodeString(&pwszAliasName,
                                           pAliasName);
    BAIL_ON_NTSTATUS_ERROR(ntStatus);

    ntStatus = SamrSrvInitUnicodeStringEx(&Name,
                                          pwszAliasName);
    BAIL_ON_NTSTATUS_ERROR(ntStatus);

    ntStatus = SamrSrvCreateAccount(hBinding,
                                    hDomain,
                                    &Name,
                                    DS_OBJECT_CLASS_LOCAL_GROUP,
                                    0,
                                    dwAccessMask,
                                    phAlias,
                                    &ulAccessGranted,
                                    pdwRid);
    if (ntStatus == STATUS_USER_EXISTS)
    {
        ntStatus = STATUS_ALIAS_EXISTS;
        BAIL_ON_NTSTATUS_ERROR(ntStatus);
    }

cleanup:
    if (pwszAliasName)
    {
        SamrSrvFreeMemory(pwszAliasName);
    }

    SamrSrvFreeUnicodeStringEx(&Name);

    return ntStatus;

error:
    *phAlias = NULL;
    *pdwRid  = 0;
    goto cleanup;
}