ntgroups.c revision 0c27b3fe77ac1d5094ba3521e8142d9e7973133f
/*
* Copyright (C) 2001, 2004, 2006, 2007, 2009, 2013, 2016 Internet Systems Consortium, Inc. ("ISC")
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
/* $Id: ntgroups.c,v 1.12 2009/09/29 23:48:04 tbox Exp $ */
/*
* The NT Groups have two groups that are not well documented and are
* not normally seen: None and Everyone. A user account belongs to
* any number of groups, but if it is not a member of any group then
* it is a member of the None Group. The None group is not listed
* anywhere. You cannot remove an account from the none group except
* by making it a member of some other group, The second group is the
* Everyone group. All accounts, no matter how many groups that they
* belong to, also belong to the Everyone group. You cannot remove an
* account from the Everyone group.
*/
#ifndef UNICODE
#define UNICODE
#endif /* UNICODE */
/*
* Silence warnings.
*/
#define _CRT_SECURE_NO_DEPRECATE 1
#include <windows.h>
#include <assert.h>
#include <lm.h>
#include <isc/ntgroups.h>
#define MAX_NAME_LENGTH 256
unsigned int maxgroups,
unsigned int *totalGroups) {
DWORD i;
DWORD dwEntriesRead = 0;
DWORD dwTotalEntries = 0;
*totalGroups = 0;
/*
* Call the NetUserGetLocalGroups function
* specifying information level 0.
*
* The LG_INCLUDE_INDIRECT flag specifies that the
* function should also return the names of the local
* groups in which the user is indirectly a member.
*/
user,
/*
* See if the call succeeds,
*/
if (nStatus != NERR_Success) {
if (nStatus == ERROR_ACCESS_DENIED)
return (ISC_R_NOPERM);
if (nStatus == ERROR_MORE_DATA)
return (ISC_R_NOSPACE);
if (nStatus == NERR_UserNotFound)
dwEntriesRead = 0;
}
/*
* Loop through the entries
*/
for (i = 0;
break;
return (ISC_R_NOMEMORY);
else
(*totalGroups)++;
pTmpLBuf++;
}
}
/* Free the allocated memory. */
/*
* Call the NetUserGetGroups function, specifying level 0.
*/
user,
/*
* See if the call succeeds,
*/
if (nStatus != NERR_Success) {
if (nStatus == ERROR_ACCESS_DENIED)
return (ISC_R_NOPERM);
if (nStatus == ERROR_MORE_DATA)
return (ISC_R_NOSPACE);
if (nStatus == NERR_UserNotFound)
dwEntriesRead = 0;
}
/*
* Loop through the entries
*/
for (i = 0;
break;
return (ISC_R_NOMEMORY);
else
(*totalGroups)++;
pTmpBuf++;
}
}
/*
* Free the allocated memory.
*/
return (ISC_R_SUCCESS);
}