mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1585 lines
43 KiB
1585 lines
43 KiB
///**************************************************************
|
|
/// Microsoft LAN Manager *
|
|
/// Copyright(c) Microsoft Corp., 1990-92 *
|
|
///**************************************************************
|
|
//
|
|
// This program is designed to do functional testing on the following
|
|
// APIs:
|
|
// NetGroupAdd
|
|
// NetGroupDel
|
|
// NetGroupGetInfo
|
|
// NetGroupSetInfo
|
|
// NetGroupEnum
|
|
// NetGroupAddUser
|
|
// NetGroupDelUsers
|
|
// NetGroupGetUsers
|
|
// NetUserGetGroups
|
|
// NetUserSetGroups
|
|
//
|
|
// Note: This assumes UASTEST1 was run previously which
|
|
// leaves two users, User1 & User2, defined on the NET.ACC.
|
|
//
|
|
//
|
|
|
|
#include <nt.h> // TIME definition
|
|
#include <ntrtl.h> // TIME definition
|
|
#include <nturtl.h> // TIME definition
|
|
#define NOMINMAX // Avoid redefinition of min and max in stdlib.h
|
|
#include <windef.h>
|
|
#include <winbase.h>
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <lmcons.h>
|
|
#include <lmapibuf.h>
|
|
#include <netlib.h>
|
|
#include <netdebug.h>
|
|
#include <lmaccess.h>
|
|
#include <lmerr.h>
|
|
#include <ntsam.h>
|
|
|
|
#include "uastest.h"
|
|
#include "accessp.h"
|
|
#include "netlogon.h"
|
|
#include "logonp.h"
|
|
|
|
#define GROUP1 L"GROUP1"
|
|
#define GROUP2 L"GROUP2"
|
|
#define GROUP3 L"GROUP3"
|
|
#define GROUP4 L"GROUP4"
|
|
#define GROUP_COMMENT L"This Group is added for demo"
|
|
#define PARM_COMMENT L"This comment was added by SetInfo (level 1002)"
|
|
|
|
#define DEFAULT_GROUP_ATTR ( SE_GROUP_MANDATORY | \
|
|
SE_GROUP_ENABLED_BY_DEFAULT )
|
|
|
|
#define GROUP_ATTR DEFAULT_GROUP_ATTR
|
|
|
|
LPWSTR group[] = {
|
|
GROUP1, GROUP2, GROUP3, GROUP4 };
|
|
|
|
|
|
|
|
DWORD group_count;
|
|
|
|
LPWSTR DefaultGroup;
|
|
|
|
|
|
|
|
|
|
void
|
|
clean_up()
|
|
{
|
|
PUSER_INFO_0 UserInfo0;
|
|
PGROUP_INFO_0 GroupInfo0;
|
|
int Failed = 0;
|
|
|
|
//
|
|
// Expects Only four groups to be present Group1 thru Group4
|
|
//
|
|
|
|
err = 0;
|
|
if (err = NetGroupDel(server, GROUP1))
|
|
if (err != NERR_GroupNotFound) {
|
|
error_exit(
|
|
FAIL, "Cleanup GroupDel wrong status",
|
|
GROUP1 );
|
|
Failed = 1;
|
|
}
|
|
|
|
err = 0;
|
|
if (err = NetGroupDel(server, GROUP2))
|
|
if (err != NERR_GroupNotFound) {
|
|
error_exit(
|
|
FAIL, "Cleanup GroupDel wrong status",
|
|
GROUP2 );
|
|
Failed = 1;
|
|
}
|
|
|
|
err = 0;
|
|
if (err = NetGroupDel(server, GROUP3))
|
|
if (err != NERR_GroupNotFound) {
|
|
error_exit(
|
|
FAIL, "Cleanup GroupDel wrong status",
|
|
GROUP3 );
|
|
Failed = 1;
|
|
}
|
|
|
|
err = 0;
|
|
if (err = NetGroupDel(server, GROUP4))
|
|
if (err != NERR_GroupNotFound) {
|
|
error_exit(
|
|
FAIL, "Cleanup GroupDel wrong status",
|
|
GROUP4 );
|
|
Failed = 1;
|
|
}
|
|
|
|
if (!Failed) {
|
|
error_exit(PASS, "Successful clean up of groups", NULL );
|
|
}
|
|
|
|
//
|
|
// count the existing number of Groups in the database
|
|
//
|
|
|
|
err = NetGroupEnum(server, 0, (LPBYTE *)&GroupInfo0, 0xffffffff,
|
|
&nread, &total, NULL);
|
|
if (err)
|
|
error_exit(FAIL, "Initial Enumeration Failed", NULL);
|
|
else
|
|
group_count = total;
|
|
|
|
(VOID)NetApiBufferFree( GroupInfo0 );
|
|
|
|
//
|
|
// also verify that USER1 and USER2 exist in database
|
|
//
|
|
|
|
if (err = NetUserGetInfo(server, USER1, 0, (LPBYTE *)&UserInfo0)) {
|
|
exit_flag = 1;
|
|
error_exit( FAIL, "Test aborted. user not in database",
|
|
USER1 );
|
|
} else {
|
|
(VOID)NetApiBufferFree( UserInfo0 );
|
|
}
|
|
|
|
if (err = NetUserGetInfo(server, USER2, 0, (LPBYTE *)&UserInfo0)) {
|
|
exit_flag = 1;
|
|
error_exit( FAIL, "Test aborted. user not in database",
|
|
USER2 );
|
|
} else {
|
|
(VOID)NetApiBufferFree( UserInfo0 );
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
add_group_l1(namep)
|
|
LPWSTR namep;
|
|
{
|
|
GROUP_INFO_1 GroupInfo1;
|
|
|
|
GroupInfo1.grpi1_name = namep;
|
|
GroupInfo1.grpi1_comment = GROUP_COMMENT;
|
|
|
|
if (err = NetGroupAdd(server, 1, (char * ) &GroupInfo1, NULL )) {
|
|
error_exit(FAIL, "GroupAdd (level 1) failed", namep );
|
|
} else {
|
|
error_exit(PASS, "Group added successfully", namep);
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
add_group_l2(namep)
|
|
LPWSTR namep;
|
|
{
|
|
GROUP_INFO_2 GroupInfo2;
|
|
|
|
GroupInfo2.grpi2_name = namep;
|
|
GroupInfo2.grpi2_comment = GROUP_COMMENT;
|
|
GroupInfo2.grpi2_attributes = GROUP_ATTR;
|
|
|
|
if (err = NetGroupAdd(server, 2, (char * ) &GroupInfo2, NULL )) {
|
|
error_exit(FAIL, "GroupAdd (level 2) failed", namep );
|
|
} else {
|
|
error_exit(PASS, "Group added successfully", namep);
|
|
}
|
|
}
|
|
|
|
void
|
|
test_add_del()
|
|
{
|
|
GROUP_INFO_0 GroupInfo0;
|
|
|
|
//
|
|
// delete a non-existent group
|
|
//
|
|
|
|
if (err = NetGroupDel(server, GROUP1)) {
|
|
if (err != NERR_GroupNotFound)
|
|
error_exit(FAIL, "Delete of non-existent group wrong status",
|
|
GROUP1 );
|
|
else
|
|
error_exit(PASS, "Delete of non-existent group denied",
|
|
GROUP1 );
|
|
|
|
err = 0;
|
|
} else
|
|
error_exit(FAIL, "Delete of non-existent group succeeded",
|
|
GROUP1 );
|
|
|
|
//
|
|
// add group level 0
|
|
//
|
|
|
|
GroupInfo0.grpi0_name = GROUP1;
|
|
if (err = NetGroupAdd(server, 0, (LPBYTE)&GroupInfo0, NULL))
|
|
error_exit(FAIL, "Add of group (Level 0) failed", GROUP1 );
|
|
else
|
|
error_exit(PASS, "Group added successfully (level 0)", GROUP1);
|
|
|
|
//
|
|
// delete group added level 0
|
|
//
|
|
|
|
if (err = NetGroupDel(server, GROUP1))
|
|
error_exit(FAIL, "Delete of group failed", GROUP1 );
|
|
else
|
|
error_exit(PASS, "Group deleted successfully", GROUP1 );
|
|
|
|
//
|
|
// add group level 1
|
|
//
|
|
|
|
error_exit(ACTION, "Try to Add group at Level 1", GROUP1 );
|
|
add_group_l1(GROUP1);
|
|
|
|
//
|
|
// delete group added level 1
|
|
//
|
|
|
|
if (err = NetGroupDel(server, GROUP1))
|
|
error_exit(FAIL, "Delete of group failed", GROUP1 );
|
|
else
|
|
error_exit(PASS, "group deleted successfully", GROUP1 );
|
|
|
|
//
|
|
// add group level 2
|
|
//
|
|
|
|
error_exit(ACTION, "Try to Add group at Level 2", GROUP1 );
|
|
add_group_l2(GROUP1);
|
|
|
|
//
|
|
// delete group added level 2
|
|
//
|
|
|
|
if (err = NetGroupDel(server, GROUP1))
|
|
error_exit(FAIL, "Delete of group failed", GROUP1 );
|
|
else
|
|
error_exit(PASS, "group deleted successfully", GROUP1 );
|
|
|
|
//
|
|
// add group 1 l0
|
|
//
|
|
|
|
GroupInfo0.grpi0_name = GROUP1;
|
|
if (err = NetGroupAdd(server, 0, (LPBYTE)&GroupInfo0, NULL))
|
|
error_exit(FAIL, "Second Add of group (level 0) failed", GROUP1 );
|
|
else
|
|
error_exit(PASS, "Group added successfully (level 0)", GROUP1 );
|
|
|
|
//
|
|
// add duplicate
|
|
//
|
|
|
|
if (err = NetGroupAdd(server, 0, (LPBYTE)&GroupInfo0, NULL)) {
|
|
if (err != NERR_GroupExists)
|
|
error_exit(FAIL, "Adding of duplicate group Wrong", GROUP1 );
|
|
else {
|
|
err = 0;
|
|
error_exit(PASS, "Adding of Duplicate Group denied", GROUP1);
|
|
}
|
|
} else
|
|
error_exit(FAIL, "Add of duplicate group succeeded", GROUP1 );
|
|
|
|
//
|
|
// add group 2 l0
|
|
//
|
|
|
|
GroupInfo0.grpi0_name = GROUP2;
|
|
if (err = NetGroupAdd(server, 0, (LPBYTE)&GroupInfo0, NULL))
|
|
error_exit(FAIL, "Second Add of group (level 0) failed", GROUP2);
|
|
else
|
|
error_exit(PASS, "Group added successfully (level 0)", GROUP2 );
|
|
|
|
//
|
|
// add group 3 l1
|
|
//
|
|
|
|
error_exit(ACTION, "Try to Add group at Level 1", GROUP3);
|
|
add_group_l1(GROUP3);
|
|
|
|
//
|
|
// add group 4 l1
|
|
//
|
|
|
|
error_exit(ACTION, "Try to Add group at Level 1", GROUP4);
|
|
add_group_l1(GROUP4);
|
|
}
|
|
|
|
//
|
|
// set_info_l1 NetGroupSetInfo call on named group. First a
|
|
// call is issued to a bogus group and then to
|
|
// the requested group
|
|
//
|
|
void
|
|
set_info_l1(namep)
|
|
LPWSTR namep;
|
|
{
|
|
GROUP_INFO_1 GroupInfo1;
|
|
|
|
GroupInfo1.grpi1_name = namep;
|
|
GroupInfo1.grpi1_comment = namep;
|
|
|
|
//
|
|
// first attempt on an invalid group
|
|
//
|
|
|
|
err = NetGroupSetInfo(server, NOTTHERE, 1, (LPBYTE)&GroupInfo1, NULL );
|
|
|
|
if (err == 0) {
|
|
error_exit(FAIL, "SetInfo (Level 1) succeed on non-existent group",
|
|
NULL );
|
|
} else if (err != NERR_GroupNotFound) {
|
|
error_exit(FAIL, "SetInfo (Level 1) on non-existent group wrong",
|
|
NULL);
|
|
} else {
|
|
error_exit(PASS, "SetInfo (Level 1) denied on non-existent group",
|
|
NULL );
|
|
}
|
|
|
|
if (_wcsicmp(NOTTHERE, namep) == 0)
|
|
return;
|
|
|
|
//
|
|
// now attempt on a valid group
|
|
//
|
|
|
|
if (err = NetGroupSetInfo(server, namep, 1, (LPBYTE)&GroupInfo1, NULL )){
|
|
error_exit(FAIL, "SetInfo (Level 1) failed", namep);
|
|
} else
|
|
error_exit(PASS, "SetInfo (Level 1) succeeded", namep);
|
|
}
|
|
|
|
//
|
|
// set_info_l2 NetGroupSetInfo call on named group. First a
|
|
// call is issued to a bogus group and then to
|
|
// the requested group
|
|
//
|
|
void
|
|
set_info_l2(namep)
|
|
LPWSTR namep;
|
|
{
|
|
GROUP_INFO_2 GroupInfo2;
|
|
|
|
GroupInfo2.grpi2_name = namep;
|
|
GroupInfo2.grpi2_comment = namep;
|
|
GroupInfo2.grpi2_attributes = GROUP_ATTR;
|
|
|
|
//
|
|
// first attempt on an invalid group
|
|
//
|
|
|
|
err = NetGroupSetInfo(server, NOTTHERE, 2, (LPBYTE)&GroupInfo2, NULL );
|
|
|
|
if (err == 0) {
|
|
error_exit(FAIL, "SetInfo (Level 2) succeed on non-existent group",
|
|
NULL );
|
|
} else if (err != NERR_GroupNotFound) {
|
|
error_exit(FAIL, "SetInfo (Level 2) on non-existent group wrong",
|
|
NULL);
|
|
} else {
|
|
error_exit(PASS, "SetInfo (Level 2) denied on non-existent group",
|
|
NULL );
|
|
}
|
|
|
|
if (_wcsicmp(NOTTHERE, namep) == 0)
|
|
return;
|
|
|
|
//
|
|
// now attempt on a valid group
|
|
//
|
|
|
|
if (err = NetGroupSetInfo(server, namep, 2, (LPBYTE)&GroupInfo2, NULL )){
|
|
error_exit(FAIL, "SetInfo (Level 2) failed", namep);
|
|
} else
|
|
error_exit(PASS, "SetInfo (Level 2) succeeded", namep);
|
|
}
|
|
|
|
void
|
|
set_group_comment(namep, buf)
|
|
LPWSTR namep;
|
|
LPWSTR buf;
|
|
{
|
|
GROUP_INFO_1002 GroupComment;
|
|
|
|
GroupComment.grpi1002_comment = buf;
|
|
|
|
if (err = NetGroupSetInfo(server, namep, 1002, (LPBYTE)&GroupComment,NULL)){
|
|
error_exit(FAIL, "SetInfo (Level 1002) failed\n", namep);
|
|
} else
|
|
error_exit(PASS, "SetInfo (Level 1002) succeeded\n", namep);
|
|
}
|
|
|
|
|
|
|
|
void
|
|
set_group_attributes(namep)
|
|
LPWSTR namep;
|
|
{
|
|
GROUP_INFO_1005 GroupComment;
|
|
|
|
GroupComment.grpi1005_attributes = GROUP_ATTR;
|
|
|
|
if (err = NetGroupSetInfo(server, namep, 1005, (LPBYTE)&GroupComment,NULL)){
|
|
error_exit(FAIL, "SetInfo (Level 1005) failed\n", namep);
|
|
} else
|
|
error_exit(PASS, "SetInfo (Level 1005) succeeded\n", namep);
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// verify_enum ACTION - Verify that NetGroupEnum (level 0/1) returned all
|
|
// the special groups (USERS, ADMINS, GUESTS) and the
|
|
// groups added for this test (GROUP1 - GROUP4).
|
|
//
|
|
|
|
void
|
|
verify_enum(level, GroupEnum)
|
|
short level;
|
|
LPBYTE GroupEnum;
|
|
{
|
|
GROUP_INFO_0 *GroupInfo0;
|
|
GROUP_INFO_1 *GroupInfo1;
|
|
GROUP_INFO_2 *GroupInfo2;
|
|
LPWSTR name;
|
|
unsigned short found = 0;
|
|
|
|
//
|
|
// number of groups read should be group_count + 4 (added for this test)
|
|
//
|
|
|
|
if (nread != group_count + 4) {
|
|
error_exit(FAIL, "Number of Groups read Incorrect", NULL );
|
|
printf("UASTEST2: Read = %u Expected = %u\n", nread, group_count + 4);
|
|
}
|
|
|
|
if (total != group_count + 4) {
|
|
error_exit(FAIL, "Total Number of Groups returned Incorrect",NULL);
|
|
printf("UASTEST2: Total = %u Expected = %u\n", total, group_count + 4);
|
|
}
|
|
|
|
if ((nread == total) & (err == 0)) {
|
|
if (level == 0)
|
|
GroupInfo0 = (GROUP_INFO_0 * ) GroupEnum;
|
|
else if (level == 1)
|
|
GroupInfo1 = (GROUP_INFO_1 * ) GroupEnum;
|
|
else
|
|
GroupInfo2 = (GROUP_INFO_2 * ) GroupEnum;
|
|
|
|
while (nread--) {
|
|
if (level == 0)
|
|
name = GroupInfo0->grpi0_name;
|
|
else if (level == 1)
|
|
name = GroupInfo1->grpi1_name;
|
|
else
|
|
name = GroupInfo2->grpi2_name;
|
|
|
|
if ( (_wcsicmp(name, GROUP1) == 0) ||
|
|
(_wcsicmp(name, GROUP2) == 0) ||
|
|
(_wcsicmp(name, GROUP3) == 0) ||
|
|
(_wcsicmp(name, GROUP4) == 0) ) {
|
|
|
|
found++;
|
|
error_exit(PASS, "Found group added for this test", name);
|
|
|
|
}
|
|
if (level == 0)
|
|
GroupInfo0++;
|
|
else if (level == 1)
|
|
GroupInfo1++;
|
|
else
|
|
GroupInfo2++;
|
|
}
|
|
}
|
|
|
|
if (found != 4)
|
|
error_exit(FAIL, "Unable to find ALL 4 groups", NULL);
|
|
else
|
|
printf("UASTEST2: PASS - Found %u groups\n", found);
|
|
}
|
|
|
|
|
|
//
|
|
// validate_enum_l0 NetGroupEnum at level 0
|
|
//
|
|
|
|
void
|
|
validate_enum_l0()
|
|
{
|
|
PGROUP_INFO_0 GroupInfo0;
|
|
if (err = NetGroupEnum(server, 0, (LPBYTE *)&GroupInfo0, 0xffffffff, &nread, &total, NULL ))
|
|
error_exit(FAIL, "NetGroupEnum (Level 0) failed", NULL );
|
|
else
|
|
error_exit(PASS, "Successful enumeration (level 0) of groups",
|
|
NULL);
|
|
|
|
verify_enum(0, (LPBYTE)GroupInfo0);
|
|
(VOID)NetApiBufferFree( GroupInfo0 );
|
|
}
|
|
|
|
|
|
//
|
|
// validate_enum_l1 NetGroupEnum at level 1
|
|
//
|
|
|
|
void
|
|
validate_enum_l1()
|
|
{
|
|
PGROUP_INFO_1 GroupInfo1;
|
|
if (err = NetGroupEnum(server, 1, (LPBYTE *)&GroupInfo1, 0xffffffff, &nread, &total, NULL ))
|
|
error_exit(FAIL, "NetGroupEnum (Level 1) failed", NULL);
|
|
else
|
|
error_exit(PASS, "NetGroupEnum (Level 1) succeeded", NULL);
|
|
|
|
verify_enum(1, (LPBYTE)GroupInfo1);
|
|
(VOID)NetApiBufferFree( GroupInfo1 );
|
|
}
|
|
|
|
|
|
//
|
|
// validate_enum_l2 NetGroupEnum at level 2
|
|
//
|
|
|
|
void
|
|
validate_enum_l2()
|
|
{
|
|
PGROUP_INFO_2 GroupInfo2;
|
|
if (err = NetGroupEnum(server, 2, (LPBYTE *)&GroupInfo2, 0xffffffff, &nread, &total, NULL ))
|
|
error_exit(FAIL, "NetGroupEnum (Level 2) failed", NULL);
|
|
else
|
|
error_exit(PASS, "NetGroupEnum (Level 2) succeeded", NULL);
|
|
|
|
verify_enum(2, (LPBYTE)GroupInfo2);
|
|
(VOID)NetApiBufferFree( GroupInfo2 );
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
test_get_set_enum_info()
|
|
{
|
|
int i;
|
|
PGROUP_INFO_0 GroupInfo0;
|
|
PGROUP_INFO_1 GroupInfo1;
|
|
PGROUP_INFO_2 GroupInfo2;
|
|
|
|
//
|
|
// get info for non-existent group
|
|
//
|
|
|
|
error_exit(ACTION, "Try GetInfo (Level 0) on Non-Existent Group", NULL);
|
|
if (err = NetGroupGetInfo(server, NOTTHERE, 0, (LPBYTE *) &GroupInfo0)) {
|
|
if (err != NERR_GroupNotFound)
|
|
error_exit(FAIL, "GetInfo (Level 0) on non-existent group",
|
|
NULL );
|
|
else {
|
|
err = 0;
|
|
error_exit(
|
|
PASS, "GetInfo (Level 0) on non-existent group denied",
|
|
NULL );
|
|
}
|
|
} else {
|
|
error_exit(FAIL, "GetInfo (Level 0) succeed on non-existent group",
|
|
NULL );
|
|
(VOID)NetApiBufferFree( GroupInfo0 );
|
|
}
|
|
|
|
//
|
|
// get info group1 Level 0
|
|
//
|
|
|
|
error_exit(ACTION, "Try GetInfo (Level 0)", GROUP1);
|
|
if (err = NetGroupGetInfo(server, GROUP1, 0, (LPBYTE * ) & GroupInfo0))
|
|
error_exit(FAIL, "GroupGetInfo (Level 0) failed", GROUP1);
|
|
else {
|
|
error_exit(PASS, "GroupGetInfo (Level 0) succeeded", GROUP1);
|
|
|
|
//
|
|
// verify data from GetInfo
|
|
//
|
|
|
|
if (_wcsicmp(GROUP1, GroupInfo0->grpi0_name) != 0)
|
|
error_exit(FAIL, "GroupGetInfo (Level 0) returned wrong name", GROUP1 );
|
|
else
|
|
error_exit(PASS, "Group name matched correctly", GROUP1);
|
|
(VOID)NetApiBufferFree( GroupInfo0 );
|
|
}
|
|
|
|
//
|
|
// get info group1 Level 1
|
|
//
|
|
|
|
error_exit(ACTION, "Try GetInfo (Level 1)", GROUP1);
|
|
if (err = NetGroupGetInfo(server, GROUP1, 1, (LPBYTE *)&GroupInfo1))
|
|
error_exit(FAIL, "GroupGetInfo (Level 1) failed", GROUP1);
|
|
else {
|
|
error_exit(PASS, "GroupGetInfo (Level 1) succeeded", GROUP1);
|
|
|
|
//
|
|
// verify data from GetInfo
|
|
//
|
|
|
|
if (_wcsicmp(GROUP1, GroupInfo1->grpi1_name) != 0)
|
|
error_exit(FAIL, "GroupGetInfo (Level 1) returned wrong name",
|
|
GROUP1);
|
|
else
|
|
error_exit(PASS, "Group name matched correctly", GROUP1);
|
|
|
|
//
|
|
// verify devault values
|
|
//
|
|
|
|
if (_wcsicmp(GroupInfo1->grpi1_comment, L"") != 0)
|
|
error_exit(
|
|
FAIL, "GroupGetInfo (Level 1) wrong default comment",
|
|
GROUP1 );
|
|
else
|
|
error_exit(PASS, "Default Comment (\"\") matched correctly",
|
|
GROUP1);
|
|
|
|
(VOID)NetApiBufferFree( GroupInfo1 );
|
|
}
|
|
|
|
//
|
|
// get info group1 Level 2
|
|
//
|
|
|
|
error_exit(ACTION, "Try GetInfo (Level 2)", GROUP1);
|
|
if (err = NetGroupGetInfo(server, GROUP1, 2, (LPBYTE *)&GroupInfo2))
|
|
error_exit(FAIL, "GroupGetInfo (Level 2) failed", GROUP1);
|
|
else {
|
|
error_exit(PASS, "GroupGetInfo (Level 2) succeeded", GROUP1);
|
|
|
|
//
|
|
// verify data from GetInfo
|
|
//
|
|
|
|
if (_wcsicmp(GROUP1, GroupInfo2->grpi2_name) != 0)
|
|
error_exit(FAIL, "GroupGetInfo (Level 2) returned wrong name",
|
|
GROUP1);
|
|
else
|
|
error_exit(PASS, "Group name matched correctly", GROUP1);
|
|
|
|
//
|
|
// verify default values
|
|
//
|
|
|
|
if (_wcsicmp(GroupInfo2->grpi2_comment, L"") != 0)
|
|
error_exit(
|
|
FAIL, "GroupGetInfo (Level 1) wrong default comment",
|
|
GROUP1 );
|
|
else
|
|
error_exit(PASS, "Default Comment (\"\") matched correctly",
|
|
GROUP1);
|
|
|
|
if (GroupInfo2->grpi2_attributes != DEFAULT_GROUP_ATTR) {
|
|
error_exit(
|
|
FAIL, "GroupGetInfo (Level 2) wrong default attributes",
|
|
GROUP1 );
|
|
|
|
printf( "UASTEST2: FAIL - %ld should be %ld \n",
|
|
GroupInfo2->grpi2_attributes, DEFAULT_GROUP_ATTR );
|
|
} else {
|
|
error_exit(PASS, "Default attributes matched correctly",
|
|
GROUP1);
|
|
}
|
|
|
|
(VOID)NetApiBufferFree( GroupInfo2 );
|
|
}
|
|
|
|
//
|
|
// get info group3 Level 1
|
|
//
|
|
|
|
error_exit(ACTION, "Try GetInfo (Level 1)", GROUP3);
|
|
if (err = NetGroupGetInfo(server, GROUP3, 1, (LPBYTE *)&GroupInfo1))
|
|
error_exit(FAIL, "GroupGetInfo (Level 1) failed", GROUP3);
|
|
else {
|
|
error_exit(PASS, "GroupGetInfo (Level 1) succeeded", GROUP3);
|
|
|
|
//
|
|
// verify set values
|
|
//
|
|
|
|
if (_wcsicmp(GroupInfo1->grpi1_name, GROUP3) != 0)
|
|
error_exit(
|
|
FAIL, "GroupGetInfo (Level 1) name mismatch",
|
|
GROUP3);
|
|
else {
|
|
error_exit(PASS, "Group name matched correctly", GROUP3);
|
|
}
|
|
|
|
if (_wcsicmp(GroupInfo1->grpi1_comment, GROUP_COMMENT) != 0) {
|
|
error_exit(FAIL, "GroupGetInfo (Level 1) comment mismatch",
|
|
GROUP3);
|
|
|
|
printf( "UASTEST2: FAIL - '" );
|
|
PrintUnicode( GroupInfo1->grpi1_comment );
|
|
printf("' should be '" );
|
|
PrintUnicode( GROUP_COMMENT );
|
|
printf( "'\n");
|
|
|
|
} else
|
|
error_exit(PASS, "Comment matched correctly", GROUP3);
|
|
|
|
(VOID)NetApiBufferFree( GroupInfo1 );
|
|
}
|
|
|
|
//
|
|
// set info on nonexistent
|
|
//
|
|
|
|
error_exit(ACTION, "Try SetInfo (Level 1) on Non-Existent Group",
|
|
NULL);
|
|
set_info_l1(NOTTHERE);
|
|
|
|
//
|
|
// set info group1
|
|
//
|
|
|
|
error_exit(ACTION, "Try SetInfo (Level 1)", GROUP1);
|
|
set_info_l1(GROUP1);
|
|
|
|
//
|
|
// verify group1 setinfo
|
|
//
|
|
|
|
error_exit(ACTION, "Verify SetInfo results", GROUP1 );
|
|
if (err = NetGroupGetInfo(server, GROUP1, 1, (LPBYTE *)&GroupInfo1))
|
|
error_exit(FAIL, "Second GroupGetInfo (Level 1) failed", GROUP1);
|
|
else {
|
|
error_exit(PASS, "Second GroupGetInfo (Level 1) succeeded",GROUP1);
|
|
|
|
//
|
|
// verify devault values
|
|
//
|
|
|
|
if (_wcsicmp(GroupInfo1->grpi1_comment, GROUP1) != 0) {
|
|
error_exit(FAIL, "comment mismatch", GROUP1);
|
|
printf( "UASTEST2: FAIL - '" );
|
|
PrintUnicode( GroupInfo1->grpi1_comment );
|
|
printf("' should be '" );
|
|
PrintUnicode( GROUP1 );
|
|
printf( "'\n");
|
|
|
|
} else
|
|
error_exit(PASS, "Comment matched correctly", GROUP1);
|
|
|
|
(VOID)NetApiBufferFree( GroupInfo1 );
|
|
}
|
|
|
|
//
|
|
// set info group2 level 1
|
|
//
|
|
|
|
error_exit(ACTION, "Try SetInfo (Level 1)", GROUP2);
|
|
set_info_l1(GROUP2);
|
|
error_exit(ACTION, "Verify SetInfo results", GROUP2);
|
|
|
|
//
|
|
// verify group2 setinfo
|
|
//
|
|
|
|
if (err = NetGroupGetInfo(server, GROUP2, 1, (LPBYTE *)&GroupInfo1))
|
|
error_exit(FAIL, "Second GroupGetInfo (Level 1) failed", GROUP2);
|
|
else {
|
|
error_exit(PASS, "Second GroupGetInfo (Level 1) succeeded",GROUP2);
|
|
|
|
//
|
|
// verify devault values
|
|
//
|
|
|
|
if (_wcsicmp(GroupInfo1->grpi1_comment, GROUP2) != 0) {
|
|
error_exit(FAIL, "comment mismatch", GROUP2);
|
|
|
|
printf( "UASTEST2: FAIL - '" );
|
|
PrintUnicode( GroupInfo1->grpi1_comment );
|
|
printf("' should be '" );
|
|
PrintUnicode( GROUP2 );
|
|
printf( "'\n");
|
|
} else
|
|
error_exit(PASS, "Comment matched correctly", GROUP2);
|
|
|
|
(VOID)NetApiBufferFree( GroupInfo1 );
|
|
}
|
|
|
|
//
|
|
// set info group2 level 2
|
|
//
|
|
|
|
error_exit(ACTION, "Try SetInfo (Level 2)", GROUP2);
|
|
set_info_l2(GROUP2);
|
|
error_exit(ACTION, "Verify SetInfo results", GROUP2);
|
|
|
|
//
|
|
// verify group2 setinfo level 2
|
|
//
|
|
|
|
if (err = NetGroupGetInfo(server, GROUP2, 2, (LPBYTE *)&GroupInfo2))
|
|
error_exit(FAIL, "Second GroupGetInfo (Level 2) failed", GROUP2);
|
|
else {
|
|
error_exit(PASS, "Second GroupGetInfo (Level 2) succeeded",GROUP2);
|
|
|
|
//
|
|
// verify devault values
|
|
//
|
|
|
|
if (_wcsicmp(GroupInfo2->grpi2_comment, GROUP2) != 0) {
|
|
error_exit(FAIL, "comment mismatch", GROUP2);
|
|
|
|
printf( "UASTEST2: FAIL - '" );
|
|
PrintUnicode( GroupInfo2->grpi2_comment );
|
|
printf("' should be '" );
|
|
PrintUnicode( GROUP2 );
|
|
printf( "'\n");
|
|
} else
|
|
error_exit(PASS, "Comment matched correctly", GROUP2);
|
|
|
|
if (GroupInfo2->grpi2_attributes != GROUP_ATTR)
|
|
error_exit(
|
|
FAIL, "GroupGetInfo (Level 2) wrong default attributes",
|
|
GROUP2 );
|
|
else
|
|
error_exit(PASS, "Default attributes (\"\") matched correctly",
|
|
GROUP2);
|
|
|
|
(VOID)NetApiBufferFree( GroupInfo2 );
|
|
}
|
|
|
|
//
|
|
// set comment using level 1002
|
|
//
|
|
|
|
set_group_comment(GROUP2, PARM_COMMENT);
|
|
if (err = NetGroupGetInfo(server, GROUP2, 1, (LPBYTE *)&GroupInfo1))
|
|
error_exit(FAIL, "Second GroupGetInfo (Level 1) failed", GROUP2);
|
|
else {
|
|
error_exit(PASS, "Second GroupGetInfo (Level 1) succeeded",GROUP2);
|
|
|
|
//
|
|
// verify devault values
|
|
//
|
|
|
|
if (_wcsicmp(GroupInfo1->grpi1_comment, PARM_COMMENT) != 0) {
|
|
error_exit(FAIL, "comment mismatch", GROUP2);
|
|
|
|
printf( "UASTEST2: FAIL - '" );
|
|
PrintUnicode( GroupInfo1->grpi1_comment );
|
|
printf("' should be '" );
|
|
PrintUnicode( PARM_COMMENT );
|
|
printf( "'\n");
|
|
} else
|
|
error_exit(PASS, "Second Comment matched correctly",GROUP2);
|
|
|
|
(VOID)NetApiBufferFree( GroupInfo1 );
|
|
}
|
|
|
|
error_exit(ACTION, "Try SetInfo (Level 1002) on GROUP1 - GROUP4",NULL);
|
|
for (i = 0; i < 4; i++)
|
|
set_group_comment(group[i], group[i]);
|
|
|
|
//
|
|
// set group attributes using level 1005
|
|
//
|
|
|
|
set_group_attributes(GROUP2);
|
|
if (err = NetGroupGetInfo(server, GROUP2, 2, (LPBYTE *)&GroupInfo2))
|
|
error_exit(FAIL, "Second GroupGetInfo (Level 2) failed", GROUP2);
|
|
else {
|
|
error_exit(PASS, "Second GroupGetInfo (Level 2) succeeded",GROUP2);
|
|
|
|
//
|
|
// verify default values
|
|
//
|
|
|
|
if (GroupInfo2->grpi2_attributes != GROUP_ATTR) {
|
|
error_exit(FAIL, "attributes mismatch", GROUP2);
|
|
|
|
printf( "UASTEST2: FAIL - %ld should be %ld \n",
|
|
GroupInfo2->grpi2_attributes, GROUP_ATTR );
|
|
} else
|
|
error_exit(PASS, "group attributes matched correctly",GROUP2);
|
|
|
|
(VOID)NetApiBufferFree( GroupInfo2 );
|
|
}
|
|
|
|
error_exit(ACTION, "Try SetInfo (Level 1005) on GROUP1 - GROUP4",NULL);
|
|
for (i = 0; i < 4; i++)
|
|
set_group_attributes(group[i]);
|
|
|
|
//
|
|
// enum all level 0
|
|
//
|
|
|
|
error_exit(
|
|
ACTION,
|
|
"Enumerate Groups (Level 0) and find those added for test",
|
|
NULL);
|
|
validate_enum_l0();
|
|
|
|
//
|
|
// enum all level 1
|
|
//
|
|
|
|
error_exit(
|
|
ACTION,
|
|
"Enumerate Groups (Level 1) and find those added for test",
|
|
NULL);
|
|
validate_enum_l1();
|
|
|
|
//
|
|
// enum all level 2
|
|
//
|
|
|
|
error_exit(
|
|
ACTION,
|
|
"Enumerate Groups (Level 2) and find those added for test",
|
|
NULL);
|
|
validate_enum_l2();
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// test_group_users Test NetGroupSetUsers & NetGroupGetUsers
|
|
//
|
|
|
|
void
|
|
test_group_users()
|
|
{
|
|
register int i;
|
|
GROUP_USERS_INFO_0 gu0;
|
|
GROUP_USERS_INFO_0 gu0Array[2];
|
|
|
|
PGROUP_USERS_INFO_0 GroupUser0;
|
|
PGROUP_USERS_INFO_1 GroupUser1;
|
|
|
|
|
|
//
|
|
// add non-exist user to group
|
|
//
|
|
|
|
gu0.grui0_name = NOTTHERE;
|
|
|
|
if (err = NetGroupSetUsers(server, GROUP1, 0, (char * ) & gu0, 1)) {
|
|
if (err != NERR_UserNotFound)
|
|
error_exit(FAIL, "NetGroupSetUsers on non-existent user wrong",
|
|
GROUP1 );
|
|
else
|
|
error_exit(PASS,
|
|
"NetGroupSetUsers on non-existent user denied",
|
|
GROUP1 );
|
|
} else
|
|
error_exit(FAIL, "NetGroupSetUsers on non-existent user succeded",
|
|
GROUP1 );
|
|
|
|
//
|
|
// add user to non-exist group
|
|
//
|
|
|
|
gu0.grui0_name = USER1;
|
|
|
|
if (err = NetGroupSetUsers(server, NOTTHERE, 0, (char * ) & gu0, 1)) {
|
|
if (err != NERR_GroupNotFound)
|
|
error_exit(FAIL, "NetGroupSetUsers on non-existent group wrong",
|
|
NULL );
|
|
else
|
|
error_exit(PASS, "NetGroupSetUsers on non-existent group denied",
|
|
NULL );
|
|
} else
|
|
error_exit(FAIL, "NetGroupSetUsers on non-existent group succeded",
|
|
NULL );
|
|
|
|
//
|
|
// add user to group1
|
|
//
|
|
|
|
gu0.grui0_name = USER1;
|
|
|
|
if (err = NetGroupSetUsers(server, GROUP1, 0, (char * ) & gu0, 1))
|
|
error_exit(FAIL, "NetGroupSetUsers unable to add USER1 to GROUP1", NULL );
|
|
else
|
|
error_exit(PASS, "NetGroupSetUsers added USER1 to GROUP1 successfully", NULL );
|
|
|
|
//
|
|
// getuser non-exist group
|
|
//
|
|
|
|
if (err = NetGroupGetUsers(server, NOTTHERE, 0, (LPBYTE *)&GroupUser0,
|
|
0xffffffff, &nread, &total, NULL)) {
|
|
if (err != NERR_GroupNotFound)
|
|
error_exit(FAIL, "NetGroupGetUsers on non-existent group wrong", NULL );
|
|
else
|
|
error_exit(PASS, "NetGroupGetUsers on non-existent group denied", NULL );
|
|
} else {
|
|
error_exit(FAIL, "NetGroupGetUsers on non-existent group succeded", NULL );
|
|
(VOID)NetApiBufferFree( GroupUser0 );
|
|
}
|
|
|
|
|
|
//
|
|
// getuser on group2 with no user
|
|
//
|
|
|
|
if (err = NetGroupGetUsers(server, GROUP2, 0, (LPBYTE *)&GroupUser0,
|
|
0xffffffff, &nread, &total, NULL))
|
|
error_exit(FAIL, "NetGroupGetUsers on group with no users failed",
|
|
GROUP2 );
|
|
else {
|
|
error_exit(PASS, "NetGroupGetUsers on group with no users succeded",
|
|
GROUP2 );
|
|
|
|
if ((nread != total) || (nread != 0))
|
|
error_exit(
|
|
FAIL, "NetGroupGetUsers returned non-zero number of users",
|
|
GROUP2);
|
|
else
|
|
error_exit(
|
|
PASS, "NetGroupGetUsers returned zero number of users",
|
|
GROUP2);
|
|
|
|
(VOID)NetApiBufferFree( GroupUser0 );
|
|
}
|
|
|
|
//
|
|
// getuser on group1 with user
|
|
//
|
|
|
|
if (err = NetGroupGetUsers(server, GROUP1, 0, (LPBYTE *)&GroupUser0,
|
|
0xffffffff, &nread, &total, NULL ))
|
|
error_exit(FAIL, "NetGroupGetUsers on group with users failed",
|
|
GROUP1);
|
|
else {
|
|
error_exit(PASS, "NetGroupGetUsers on group with users succeded",
|
|
GROUP1);
|
|
|
|
if ((nread != total) || (nread != 1)) {
|
|
printf( "nread: %ld total: %ld\n", nread, total );
|
|
error_exit(
|
|
FAIL, "NetGroupGetUsers returned wrong number of users",
|
|
GROUP1);
|
|
} else
|
|
error_exit(
|
|
PASS, "NetGroupGetUsers returned correct number of users",
|
|
GROUP1);
|
|
|
|
if ( nread > 0 ) {
|
|
if (_wcsicmp( GroupUser0->grui0_name, USER1) != 0)
|
|
error_exit(FAIL, "NetGroupGetUsers returned wrong user",
|
|
GROUP1);
|
|
else
|
|
error_exit(
|
|
PASS, "NetGroupGetUsers returned USER1 (correct user)",
|
|
GROUP1);
|
|
}
|
|
|
|
(VOID)NetApiBufferFree( GroupUser0 );
|
|
}
|
|
|
|
//
|
|
// getuser on group1 with user level 1
|
|
//
|
|
|
|
if (err = NetGroupGetUsers(server, GROUP1, 1, (LPBYTE *)&GroupUser1,
|
|
0xffffffff, &nread, &total, NULL ))
|
|
error_exit(FAIL, "NetGroupGetUsers on group with users failed",
|
|
GROUP1);
|
|
else {
|
|
error_exit(PASS, "NetGroupGetUsers on group with users succeded",
|
|
GROUP1);
|
|
|
|
if ((nread != total) || (nread != 1)) {
|
|
printf( "nread: %ld total: %ld\n", nread, total );
|
|
error_exit(
|
|
FAIL, "NetGroupGetUsers returned wrong number of users",
|
|
GROUP1);
|
|
} else
|
|
error_exit(
|
|
PASS, "NetGroupGetUsers returned correct number of users",
|
|
GROUP1);
|
|
|
|
if ( nread > 0 ) {
|
|
if (_wcsicmp( GroupUser1->grui1_name, USER1) != 0)
|
|
error_exit(FAIL, "NetGroupGetUsers returned wrong user",
|
|
GROUP1);
|
|
else
|
|
error_exit(
|
|
PASS, "NetGroupGetUsers returned USER1 (correct user)",
|
|
GROUP1);
|
|
}
|
|
|
|
(VOID)NetApiBufferFree( GroupUser1 );
|
|
}
|
|
|
|
//
|
|
// delete user from group
|
|
//
|
|
|
|
if (err = NetGroupDelUser(server, GROUP1, USER1))
|
|
error_exit(FAIL, "NetGroupDelUser (USER1, GROUP1) failed", NULL);
|
|
else
|
|
error_exit(
|
|
PASS, "NetGroupDelUser deleted USER1 from GROUP1 successfully",
|
|
NULL);
|
|
|
|
//
|
|
// verify delete of user
|
|
//
|
|
|
|
if (err = NetGroupGetUsers(server, GROUP1, 0, (LPBYTE *)&GroupUser0,
|
|
0xffffffff, &nread, &total, NULL ))
|
|
error_exit(FAIL, "NetGroupGetUsers failed", GROUP1 );
|
|
else {
|
|
if ((nread != total) && (nread != 0))
|
|
error_exit(FAIL, "NetGroupGetUsers returned non-zero",GROUP1);
|
|
|
|
(VOID)NetApiBufferFree( GroupUser0 );
|
|
}
|
|
|
|
//
|
|
// add all users (USER1 and USER2) to all groups
|
|
//
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
gu0Array[0].grui0_name = USER1;
|
|
gu0Array[1].grui0_name = USER2;
|
|
if (err = NetGroupSetUsers(server, group[i], 0, (char * ) gu0Array, 2))
|
|
error_exit(FAIL, "Adding of USER1 and USER2 as member", group[i]);
|
|
else
|
|
error_exit(PASS, "USER1 and USER2 added to as member successfully",
|
|
group[i]);
|
|
|
|
}
|
|
|
|
//
|
|
// verify for one group
|
|
//
|
|
|
|
if (err = NetGroupGetUsers(server, GROUP1, 0, (LPBYTE *)&GroupUser0,
|
|
0xffffffff, &nread, &total, NULL))
|
|
error_exit(FAIL, "NetGroupGetUsers after mass add failed", GROUP1);
|
|
|
|
else {
|
|
PGROUP_USERS_INFO_0 TempGroupUser0;
|
|
error_exit(PASS, "NetGroupGetUsers after mass add succeeded",
|
|
GROUP1);
|
|
if ((nread != total) || (nread != 2)) {
|
|
printf( "nread: %ld total: %ld\n", nread, total );
|
|
error_exit(
|
|
FAIL, "NetGroupGetUsers after mass add wrong # of users",
|
|
GROUP1 );
|
|
}
|
|
|
|
|
|
TempGroupUser0 = GroupUser0;
|
|
if (_wcsicmp(TempGroupUser0->grui0_name, USER1) == 0) {
|
|
TempGroupUser0++;
|
|
if (nread < 2 || _wcsicmp(TempGroupUser0->grui0_name, USER2) != 0)
|
|
error_exit(
|
|
FAIL, "NetGroupGetUsers after mass add missing USER2",
|
|
GROUP1);
|
|
else
|
|
error_exit(PASS, "Found both USER1 and USER2", GROUP1);
|
|
} else if (_wcsicmp(TempGroupUser0->grui0_name, USER2) == 0) {
|
|
TempGroupUser0++;
|
|
if (nread < 2 || _wcsicmp(TempGroupUser0->grui0_name, USER1) != 0)
|
|
error_exit(
|
|
FAIL, "NetGroupGetUsers after mass add missing USER1",
|
|
GROUP1 );
|
|
else
|
|
error_exit(PASS, "Found both USER1 and USER2",
|
|
GROUP1);
|
|
} else {
|
|
error_exit(
|
|
FAIL, "NetGroupGetUsers after mass add incorrect users returned",
|
|
GROUP1);
|
|
}
|
|
|
|
(VOID)NetApiBufferFree( GroupUser0 );
|
|
}
|
|
}
|
|
|
|
//
|
|
// verfiy_ul0 verify the information returned by NetUserGetGroups
|
|
//
|
|
|
|
void
|
|
verify_ul0(
|
|
PGROUP_INFO_0 GroupInfo0
|
|
)
|
|
{
|
|
LPWSTR name;
|
|
unsigned short found = 0;
|
|
|
|
if (nread != 5) {
|
|
printf("UASTEST2: FAIL - Incorrect number of users read %ld s.b. 5\n",
|
|
nread );
|
|
TEXIT;
|
|
}
|
|
|
|
if (total != 5) {
|
|
printf("UASTEST2: FAIL - Incorrect total number of users returned %ld s.b. 5\n", total );
|
|
TEXIT;
|
|
}
|
|
|
|
//
|
|
// note that USER1 must have been added with USER privs hence
|
|
// it will be member of USER group as well as GROUP1 thru GROUP4
|
|
// since that was done in previous test
|
|
//
|
|
// Note: "Users" is spelled "None" on a workstation.
|
|
//
|
|
|
|
if ((nread == total) && (err == 0)) {
|
|
while (nread--) {
|
|
if (_wcsicmp(GroupInfo0->grpi0_name, DefaultGroup ) == 0 ) {
|
|
printf("UASTEST2: Found membership in automatic group %ws\n",
|
|
DefaultGroup );
|
|
found++;
|
|
} else {
|
|
name = GroupInfo0->grpi0_name;
|
|
if ( (_wcsicmp(name, GROUP1) == 0) ||
|
|
(_wcsicmp(name, GROUP2) == 0) ||
|
|
(_wcsicmp(name, GROUP3) == 0) ||
|
|
(_wcsicmp(name, GROUP4) == 0) ) {
|
|
found++;
|
|
error_exit(PASS, "Found group added for this test", name);
|
|
}
|
|
}
|
|
GroupInfo0++;
|
|
}
|
|
}
|
|
|
|
if (found != 5)
|
|
error_exit(FAIL, "Unable to find ALL 5 Groups", NULL );
|
|
else
|
|
printf("UASTEST2: PASS - Found %u groups\n", found);
|
|
|
|
}
|
|
|
|
|
|
//
|
|
// verfiy_ul1 verify the information returned by NetUserGetGroups
|
|
//
|
|
|
|
void
|
|
verify_ul1(
|
|
PGROUP_INFO_1 GroupInfo1
|
|
)
|
|
{
|
|
LPWSTR name;
|
|
unsigned short found = 0;
|
|
|
|
if (nread != 5) {
|
|
printf("UASTEST2: FAIL - Incorrect number of users read\n");
|
|
TEXIT;
|
|
}
|
|
|
|
if (total != 5) {
|
|
printf("UASTEST2: FAIL - Incorrect total number of users returned\n");
|
|
TEXIT;
|
|
}
|
|
|
|
//
|
|
// note that USER1 must have been added with USERS privs hence
|
|
// it will be member of USERS group as well as GROUP1 thru GROUP4
|
|
// since that was done in previous test
|
|
//
|
|
|
|
if ((nread == total) && (err == 0)) {
|
|
while (nread--) {
|
|
if (_wcsicmp(GroupInfo1->grpi1_name, DefaultGroup) == 0) {
|
|
printf("UASTEST2: Found membership in automatic group %ws\n",
|
|
DefaultGroup );
|
|
found++;
|
|
} else {
|
|
name = GroupInfo1->grpi1_name;
|
|
if ( (_wcsicmp(name, GROUP1) == 0) ||
|
|
(_wcsicmp(name, GROUP2) == 0) ||
|
|
(_wcsicmp(name, GROUP3) == 0) ||
|
|
(_wcsicmp(name, GROUP4) == 0) ) {
|
|
found++;
|
|
error_exit(PASS, "Found group added for this test", name);
|
|
}
|
|
}
|
|
GroupInfo1++;
|
|
}
|
|
}
|
|
|
|
if (found != 5)
|
|
error_exit(FAIL, "Unable to find ALL 5 Groups", NULL );
|
|
else
|
|
printf("UASTEST2: PASS - Found %u groups\n", found);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
// verify_del_user verifies the buffer returned by NetUserGetGroups
|
|
// after NetGroupDelUser calls
|
|
//
|
|
|
|
void
|
|
verify_del_l0(
|
|
PGROUP_INFO_0 GroupInfo0
|
|
)
|
|
{
|
|
|
|
if (nread != 1) {
|
|
printf("UASTEST2: Incorrect number of users read\n");
|
|
TEXIT;
|
|
}
|
|
|
|
if (total != 1) {
|
|
printf("UASTEST2: Incorrect total number of users returned\n");
|
|
TEXIT;
|
|
}
|
|
|
|
if ((nread == 1) && (total == 1) && (err == 0)) {
|
|
if (_wcsicmp(GroupInfo0->grpi0_name, DefaultGroup ) == 0) {
|
|
printf(
|
|
"UASTEST2: PASS - Automatic membership in %ws confirmed\n",
|
|
DefaultGroup );
|
|
} else {
|
|
error_exit(FAIL, "Invalid membership in group\n",
|
|
GroupInfo0->grpi0_name);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// test_user_group Test NetUserGetGroups & NetUserSetGroups
|
|
//
|
|
|
|
void
|
|
test_user_group()
|
|
{
|
|
GROUP_INFO_0 GroupInfo0[5];
|
|
PGROUP_INFO_0 GroupInfo0Ret;
|
|
PGROUP_INFO_1 GroupInfo1Ret;
|
|
|
|
|
|
//
|
|
// get groups on invalid user
|
|
//
|
|
|
|
if (err = NetUserGetGroups(server, NOTTHERE, 0, (LPBYTE *)&GroupInfo0Ret,
|
|
0xffffffff, &nread, &total)) {
|
|
if (err != NERR_UserNotFound)
|
|
error_exit(
|
|
FAIL, "NetUserGetGroups for non-existent user wrong",
|
|
NULL );
|
|
else
|
|
error_exit(
|
|
PASS, "NetUserGetGroups for non-existent user denied",
|
|
NULL );
|
|
} else {
|
|
error_exit(
|
|
FAIL, "NetUserGetGroups succeeded for non-existent user",
|
|
NULL );
|
|
(VOID)NetApiBufferFree( GroupInfo0Ret );
|
|
}
|
|
|
|
//
|
|
// get groups for user1 level 0
|
|
//
|
|
|
|
if (err = NetUserGetGroups(server, USER1, 0, (LPBYTE *)&GroupInfo0Ret,
|
|
0xffffffff, &nread, &total))
|
|
error_exit(FAIL, "NetUserGetGroups failed (level 0)", USER1 );
|
|
else {
|
|
error_exit(PASS, "NetUserGetGroups succeeded (level 0)", USER1 );
|
|
error_exit(ACTION, "Verify results of NetUserGetGroups (level 0)", USER1);
|
|
verify_ul0( GroupInfo0Ret );
|
|
(VOID)NetApiBufferFree( GroupInfo0Ret );
|
|
}
|
|
|
|
//
|
|
// get groups for user1 level 1
|
|
//
|
|
|
|
if (err = NetUserGetGroups(server, USER1, 1, (LPBYTE *)&GroupInfo1Ret,
|
|
0xffffffff, &nread, &total))
|
|
error_exit(FAIL, "NetUserGetGroups failed (level 1)", USER1 );
|
|
else {
|
|
error_exit(PASS, "NetUserGetGroups succeeded (level 1)", USER1 );
|
|
error_exit(ACTION, "Verify results of NetUserGetGroups (level 1)", USER1);
|
|
verify_ul1( GroupInfo1Ret );
|
|
(VOID)NetApiBufferFree( GroupInfo1Ret );
|
|
}
|
|
|
|
//
|
|
// delete user from groups
|
|
//
|
|
|
|
if (err = NetGroupDelUser(server, GROUP1, USER1))
|
|
error_exit(
|
|
FAIL, "NetGroupDelUser unable to delete USER1 from GROUP1",
|
|
GROUP1 );
|
|
else
|
|
error_exit(
|
|
PASS, "NetGroupDelUser successfully deleted USER1 from GROUP1",
|
|
GROUP1);
|
|
|
|
if (err = NetGroupDelUser(server, GROUP2, USER1))
|
|
error_exit(
|
|
FAIL, "NetGroupDelUser unable to delete USER1 from GROUP2",
|
|
GROUP2 );
|
|
else
|
|
error_exit(
|
|
PASS, "NetGroupDelUser successfully deleted USER1 from GROUP2",
|
|
GROUP2 );
|
|
|
|
if (err = NetGroupDelUser(server, GROUP3, USER1))
|
|
error_exit(
|
|
FAIL, "NetGroupDelUser unable to delete USER1 from GROUP3",
|
|
GROUP3 );
|
|
else
|
|
error_exit(
|
|
PASS, "NetGroupDelUser successfully deleted USER1 from GROUP3",
|
|
GROUP3 );
|
|
|
|
if (err = NetGroupDelUser(server, GROUP4, USER1))
|
|
error_exit(
|
|
FAIL, "NetGroupDelUser unable to delete USER1 from GROUP4",
|
|
GROUP4 );
|
|
else
|
|
error_exit(
|
|
PASS, "NetGroupDelUser successfully deleted USER1 from GROUP4",
|
|
GROUP4 );
|
|
|
|
|
|
//
|
|
// get groups for user1
|
|
//
|
|
|
|
if (err = NetUserGetGroups(server, USER1, 0, (LPBYTE *)&GroupInfo0Ret,
|
|
0xffffffff, &nread, &total))
|
|
error_exit(
|
|
FAIL, "NetUserGetGroups for USER1 failed", USER1 );
|
|
else {
|
|
error_exit(PASS, "NetUserGetGroups for USER1 succeeded", USER1 );
|
|
error_exit(ACTION, "Verify results after NetGroupDelUser", USER1);
|
|
verify_del_l0( GroupInfo0Ret );
|
|
(VOID)NetApiBufferFree( GroupInfo0Ret );
|
|
}
|
|
|
|
//
|
|
// set groups for invalid user
|
|
//
|
|
|
|
GroupInfo0[0].grpi0_name = GROUP1;
|
|
GroupInfo0[1].grpi0_name = GROUP2;
|
|
GroupInfo0[2].grpi0_name = GROUP3;
|
|
GroupInfo0[3].grpi0_name = GROUP4;
|
|
|
|
if (err = NetUserSetGroups(server, NOTTHERE, 0, (LPBYTE)&GroupInfo0, 4 )) {
|
|
if (err != NERR_UserNotFound)
|
|
error_exit(
|
|
FAIL, "NetUserSetGroups for non-existent user wrong",
|
|
NULL );
|
|
else
|
|
error_exit(
|
|
PASS, "NetUserSetGroups for non-existent user denied",
|
|
NULL );
|
|
} else
|
|
error_exit(
|
|
FAIL, "NetUserSetGroups for non-existent user succeeded",
|
|
NULL );
|
|
|
|
//
|
|
// set groups for valid user
|
|
//
|
|
|
|
GroupInfo0[0].grpi0_name = GROUP1;
|
|
GroupInfo0[1].grpi0_name = GROUP2;
|
|
GroupInfo0[2].grpi0_name = GROUP3;
|
|
GroupInfo0[3].grpi0_name = GROUP4;
|
|
GroupInfo0[4].grpi0_name = DefaultGroup;
|
|
|
|
if (err = NetUserSetGroups(server, USER1, 0, (LPBYTE)&GroupInfo0, 5 )) {
|
|
error_exit(FAIL, "NetUserSetGroups for USER1 failed", NULL );
|
|
} else
|
|
error_exit(PASS, "NetUserSetGroups for USER1 succeeded", NULL );
|
|
|
|
//
|
|
// verify set of groups
|
|
//
|
|
|
|
if (err = NetUserGetGroups(server, USER1, 0, (LPBYTE *)&GroupInfo0Ret,
|
|
0xffffffff, &nread, &total))
|
|
error_exit(FAIL, "NetUserGetGroups for USER1 failed", NULL );
|
|
else {
|
|
error_exit(PASS, "NetUserGetGroups for USER1 succeeded", NULL );
|
|
|
|
printf("UASTEST2: Verify results of NetUserSetGroups on USER1\n");
|
|
verify_ul0( GroupInfo0Ret );
|
|
(VOID)NetApiBufferFree( GroupInfo0Ret );
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
main(argc, argv)
|
|
int argc;
|
|
char **argv;
|
|
{
|
|
NT_PRODUCT_TYPE NtProductType;
|
|
testname = "UASTEST2";
|
|
|
|
if (argv[1] != NULL)
|
|
server = NetpLogonOemToUnicode(argv[1]);
|
|
if (argc > 1)
|
|
exit_flag = 1;
|
|
|
|
//
|
|
// On WinNt, a user is added to group "None" by default.
|
|
// On LanManNt, a user is added to group "Users" by default.
|
|
//
|
|
|
|
if ( RtlGetNtProductType( &NtProductType ) ) {
|
|
if ( NtProductType == NtProductLanManNt ) {
|
|
DefaultGroup = L"Users";
|
|
} else {
|
|
DefaultGroup = L"None";
|
|
}
|
|
} else {
|
|
printf("UASTEST2: FAIL: cannot determine product type\n");
|
|
DefaultGroup = L"None";
|
|
}
|
|
|
|
#ifdef UASP_LIBRARY
|
|
printf( "Calling UaspInitialize\n");
|
|
if (err = UaspInitialize()) {
|
|
error_exit( FAIL, "UaspInitiailize failed", NULL );
|
|
}
|
|
#endif // UASP_LIBRARY
|
|
|
|
printf("\n");
|
|
printf("******** Starting UASTEST2: NetGroup API tests ********\n");
|
|
clean_up();
|
|
printf("UASTEST2: test_add_del() ... started\n");
|
|
test_add_del();
|
|
printf("UASTEST2: test_get_set_enum_info() ... started\n");
|
|
test_get_set_enum_info();
|
|
printf("UASTEST2: test_group_users() ... started\n");
|
|
test_group_users();
|
|
printf("UASTEST2: test_user_group() ... started\n");
|
|
test_user_group();
|
|
printf("******** Completed UASTEST2: NetGroup API tests ********\n");
|
|
printf("\n");
|
|
}
|