Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Для створення облікового запису локальної групи в базі даних менеджера облікових записів використовується функція NetLocalGroupAdd, яка має наступний прототип:
NET_API_STATUS NetLocalGroupAdd(
LPCWSTR servername, // ім’я сервера
DWORD level, // рівень інформації
LPBYTE buf, // буфер з інформацією
LPDWORD parm_err // індексування помилки
);
У разі успішного завершення функція NetLocaiGroupAdd повертає значення NERR_Success, а у разі невдачі можливі наступні коди завершення:
Параметри функції NetLocaiGroupAdd мають наступне призначення.
Параметр servername повинен указувати на рядок з ім’ям сервера, на якому виконуватиметься функція. Цей рядок повинен мати кодування Unicode і починатися з символів \\. Якщо функція повинна виконуватися на локальному комп’ютері, то цей параметр повинен мати значення null.
Параметр level указує тип структури, яка містить інформацію про локальну групу. Цей параметр може приймати одне з наступних значень:
0 — використовується структура типу localgroup_info_0;
1 — використовується структура типу localgroup_info_1.
У прикладі буде використана структура типу localgroup_info_1, опис якої і буде приведено після опису функції. Опис типу структури localgroup_info_0 може бути знайдений в MSDN.
Параметр buf повинен указувати на буфер з інформацією про локальну групу. Інформація повинна зберігатися в структурі, тип якої заданий параметром level.
У змінну, на яку указує параметр parm_err, функція NetLocaiGroupAdd поміщає індекс першого поля в структурі з інформацією про локальну групу, яке містить неправильні дані і, як наслідок, викликає завершення функції NetLocaiGroupAdd з помилкою. У цьому параметрі може бути встановлене значення null. В цьому випадку індекс поля з неправильними даними не повертається.
Оскільки в лістингу буде використана структура типу localgroup_info_1, то приведемо тип і опишемо призначення полів цієї структури. Структура localgroup_info_1 має наступний тип:
typedef struct _LOCALGROUP_INFO_1 {
LPWSTR lgrpi1_name; // ім’я групи
LPWSTR lgrpi1_comment; // коментарі
}LOCALGROUP_INFO_1, * PLOCALGROUP_INFO_1, * LPLOCALGROUP_INFO_1;
Поля цієї структури мають наступне призначення.
У полі igrpil_name зберігається покажчик на рядок з ім’ям локальної групи. Довжина рядка не повинна перевищувати gnlen байт, а сам рядок повинен мати кодування Unicode.
У полі igrpil_comment зберігається покажчик на рядок з коментарями щодо локальної групи. Довжина рядка не повинна перевищувати maxcommentsz байтів, а сам рядок повинен мати кодування Unicode.
У лістингу 1 приведена програма, яка створює локальну групу, використовуючи для цього функцію NetLocalGroupAdd.
Лістинг 1. Створення локальної групи
#include <stdio.h>
#include <windows.h>
#include <lm.h>
#pragma comment( lib, "netapi32.lib" ) // підключаємо мережеву бібліотеку
int main()
{
wchar_t server_name[256]= L"\\\\"; // ім’я сервера
wchar_t group_name[GNLEN]; // ім’я локальної групи
wchar_t comment[MAXCOMMENTSZ]; // коментар про групу
LOCALGROUP_INFO_1 group_info; // інформація про групу
NET_API_STATUS ret_status; // код повернення з функції
printf("Input server name: ");
// формуємо ім’я сервера
wscanf(L"%s", server_name + wcslen(server_name));
printf("Input a name for the local group: ");
wscanf(L"%s", group_name); // вводимо ім’я групи
group_info.lgrpi1_name = group_name; // встановлюємо адрес імені в структуру
printf("Input group comments: ");
getwchar(); // очищаємо потік
_getws(comment); // читаємо коментар про локальну групу
group_info.lgrpi1_comment = comment; // встановлюємо коментар
// створюємо локальну групу
ret_status = NetLocalGroupAdd(
server_name, // ім’я сервера
1, // рівень вхідних даних
(LPBYTE)&group_info, // ім’я групи і коментарі
NULL); // індексацію даних не використовуємо
if (ret_status != NERR_Success)
{
printf("Net local group add failed.\n");
return ret_status;
}
printf("The group is created.\n");
return 0;
}
Для отримання інформації про локальну групу використовується функція NetLocalGroupGetinfo, яка має наступний прототип:
NET_API_STATUS NetLocalGroupGetinfo(
LPCWSTR servername, // ім’я сервера
LPCWSTR groupname, // ім’я групи
DWORD level, // рівень інформації
LPBYTE *bufptr // буфер для інформації
);
Відзначимо, що успішно цю функцію можуть виконати тільки користувачі, які є адміністраторами або операторами облікових записів.
У разі успішного завершення функція NetLocalGroupGetinfo повертає значення NERR_success, а у разі невдачі можливі наступні коди завершення:
Параметри функції NetLocalGroupGetinfo мають наступне призначення.
Параметр servername повинен указувати на рядок з ім’ям сервера, на якому виконуватиметься функція. Цей рядок повинен мати кодування Unicode і починатися з символів \\. Якщо функція повинна виконуватися на локальному комп’ютері, то цей параметр повинен мати значення null.
Параметр groupname повинен указувати на рядок з ім’ям локальної групи, про яку отримують інформацію. Цей рядок повинен мати кодування Unicode.
Параметр level указує тип структури, яка містить інформацію про локальну групу. Цей параметр може приймати тільки одне значення — 1, яке вказує на те, що використовується структура типу localgroup_info_1;
Параметр bufptr повинен містити адресу покажчика, в який система запише адресу буфера з інформацією про локальні групи. Пам’ять під буфер розподіляється системою. Тому після прочитання інформації з буфера В лістингу 2 приведена програма, яка отримує інформацію про локальну Групу, використовуючи для цього функцію NetLocalGroupGetinfo.
Лістинг 2. Отримання інформації про локальну групу
#include <stdio.h>
#include <windows.h>
#include <lm.h>
#pragma comment( lib, "netapi32.lib" ) // підключаємо мережеву бібліотеку
int main()
{
wchar_t server_name[256] = L"\\\\"; // ім’я сервера
wchar_t group_name[GNLEN]; // ім’я локальної групи
LOCALGROUP_INFO_1 *buf_ptr = NULL; // адрес буфера для даних
NET_API_STATUS ret_status; // код повернення з функції
printf("Input server name: ");
// формуємо ім’я сервера
wscanf(L"%s", server_name + wcslen(server_name));
printf("Input a name for the local group: ");
wscanf(L"%s", group_name); // вводимо ім’я групи
// отримуємо інформацію про локальну групу
ret_status = NetLocalGroupGetInfo(
server_name, // ім’я сервера
group_name, // ім’я групи
1, // отримуємо ім’я групи і коментар
(LPBYTE*)&buf_ptr); // вказівник на адресу буфера для даних
// перевіряємо завершення функції
if (ret_status != NERR_Success)
{
printf("Net local group get info failed.\n");
NetApiBufferFree(buf_ptr); // звільняємо буфер для даних
return ret_status;
}
// виводимо на консоль ім’я локальної групи і коментар
wprintf(L"Local group name: %s\n", buf_ptr->lgrpi1_name);
wprintf(L"Comment: %s\n", buf_ptr->lgrpi1_comment);
NetApiBufferFree(buf_ptr); // звільняємо буфер для даних
return 0;
}
Для перерахування локальних груп, облікові записи яких зарегистрірованни на заданому сервері, використовується функція NetLocaiGroupEnum, яка має наступний прототип:
NET_API_STATUS NetLocaiGroupEnum(
LPCWSTR servername, // ім’я сервера
DWORD level, // рівень інформації
LPBYTE *bufptr, // буфер для інформації
DWORD prefmaxlen, // довжина буфера
LPDWORD entriesread, // кількість прочитаних структур
LPDWORD totalentries, // загальна кількість груп
LPDWORD resumehandle // дескриптор для продовження перерахування
);
У разі успішного завершення функція NetLocalGroupEnum повертає значення NERR_success, а у разі невдачі можливі наступні коди завершення:
У лістингу 3 приведена програма, яка перераховує локальні групи, зареєстровані на сервері, використовуючи для цього функцію NetLocalGroupEnum.
Лістинг 3. Перерахування локальних груп
#include <stdio.h>
#include <windows.h>
#include <lm.h>
#pragma comment( lib, "netapi32.lib" ) // підключаємо мережеву бібліотеку
int main()
{
DWORD entries_read; // кількість елементів
DWORD total_entries; // нумерація елементів
LOCALGROUP_INFO_1 *buf_ptr = NULL; // адреса буфера для даних
NET_API_STATUS ret_status; // код повернення з функції
// перераховуємо локальні групи
ret_status = NetLocalGroupEnum(
NULL, // локальний комп’ютер
1, // отримуємо ім’я групи і коментар
(LPBYTE*)&buf_ptr, // покажчик на адресу буфера для даних
MAX_PREFERRED_LENGTH, // довжина буфера на вимогу
&entries_read, // покажчик на кількість елементів
&total_entries, // покажчик на нумерацію елементів
NULL);
// перевіряємо завершення функції
if (ret_status != NERR_Success)
{
printf("Net local group enumeration failed.\n");
NetApiBufferFree(buf_ptr); // звільняємо буфер для даних
return ret_status;
}
printf("Local groups enumeration:\n");
// виводимо на консоль імена локальних груп і коментарі
for (DWORD i = 0; i < entries_read; ++i)
{
wprintf(L"Name: %s\n", buf_ptr[i].lgrpi1_name);
wprintf(L"Comment: %s\n", buf_ptr[i].lgrpi1_comment);
}
NetApiBufferFree(buf_ptr); // звільняємо буфер для даних
return 0;
}
Для зміни імені локальної групи і коментарів про локальну групу Використовується функція NetLocalGroupSetinfo, Яка Має наступний прототип:
NET_API_STATUS NetLocalGroupSetinfo(
LPCWSTR servername, // ім’я сервера
LPCWSTR groupname, // ім’я групи
DWORD level, // рівень інформації
LPBYTE buf, // буфер з інформацією
LPDWORD parm_err // індексування помилки
);
У разі успішного завершення функція NetLocalGroupSetinfo повертає значення NERR_success, а у разі невдачі можливі наступні коди завершення:
Параметри функції NetLocalGroupSetinfо мають наступне призначення.
Параметр servername повинен указувати на рядок з ім’ям сервера, на якому виконуватиметься функція. Цей рядок повинен мати кодування Unicode і починатися з символів \\. Якщо функція повинна виконуватися на локальному комп’ютері, то цей параметр повинен мати значення null.
Параметр groupname повинен указувати на рядок з ім’ям групи, інформація про яку змінюється. Цей рядок повинен мати кодування Unicode.
Параметр level указує тип структури, яка містить інформацію про локальну групу. Цей параметр може приймати одне з наступних значень:
0 — використовується структура типу localgroup_info_0;
1 — використовується структура типу localgroup_info_1;
1002 — використовується структура типу localgroup_info_1002.
Параметр buf повинен указувати на буфер з інформацією про локальну групу. Інформація повинна зберігатися в структурі, тип якої заданий параметром level.
У змінну, на яку указує параметр parm_err, функція NetLocalGroupSetinfo поміщає індекс першого поля в структурі з інформацією про локальну групу, яке містить неправильні дані і, як наслідок, викликало завершення функції NetLocalGroupSetinfo з помилкою.
У подвійне слово, на яке указує параметр, функція NetLocalGroupSetinfo може записати одне з наступних значень:
У цьому параметрі може бути встановлене значення null. В цьому випадку індекс поля з неправильними даними не повертається.
Тепер опишемо структуру localgroup_info_0, яка має наступний тип:
typedef struct _LOCALGROUP_INFO_0 {
LPWSTR igrpi0_name; // ім’я групи
}LOCALGROUP_INFO_0, * PLOCALGROUP_INFO_0, * LPLOCALGROUP_INFO_0;
У єдиному полі igrpi0_name зберігається покажчик на рядок з ім’ям локальної групи. Довжина рядка не повинна перевищувати gnlen байт, а сам рядок повинен мати кодування Unicode.
У лістингу 4 приведена програма, яка змінює ім’я локальної групи, використовуючи для цього функцію NetLocalGroupSetlnfo.
Лістинг 4. Зміна імені локальної групи
#include <stdio.h>
#include <windows.h>
#include <lm.h>
#pragma comment( lib, "netapi32.lib" ) // підключаємо мережеву бібліотеку
int main()
{
wchar_t server_name[256]= L"\\\\"; // ім’я сервера
wchar_t old_name[GNLEN]; // старе ім’я локальної групи
wchar_t new_name[GNLEN]; // нове ім’я локальної групи
wchar_t comment[MAXCOMMENTSZ]; // новий коментар
LOCALGROUP_INFO_0 group_info_0; // інформація про ім’я групи
LOCALGROUP_INFO_1 group_info_1; // опис нової групи
NET_API_STATUS ret_status; // код повернення з функції
printf("Input а server name: ");
// формуємо ім’я сервера
wscanf(L"%s", server_name + wcslen(server_name));
printf("Input a local group name: ");
wscanf(L"%s", old_name); // вводимо ім’я групи
printf("Input а new name for the group: ");
wscanf(L"%s", new_name); // вводимо нове ім’я групи
// встановлюємо адресу імені в структуру
group_info_0.lgrpi0_name = new_name;
// змінюємо ім’я групи
ret_status = NetLocalGroupSetInfo(
server_name, // ім’я сервера
old_name, // ім’я групи
0, // нове ім’я групи
(LPBYTE)&group_info_0, // нова інформація про групу
NULL); // індексування інформації немає
// перевіряємо завершення функції
if (ret_status != NERR_Success)
{
printf("Net local group set name failed.\n");
return ret_status;
}
printf("Local group name was changed.\n");
printf("Input group comments: ");
getwchar(); // очищаємо потік
_getws(comment); // читаємо коментарі про користувача
// встановлюємо новий коментар
group_info_1.lgrpi1_comment = comment;
// змінюємо опис групи
ret_status = NetLocalGroupSetInfo(
server_name, // ім’я сервера
new_name, // ім’я групи
1, // отримуємо ім’я групи і коментар
(LPBYTE)&group_info_1, // новий опис групи
NULL); // індексування інформації немає
// перевіряємо завершення функції
if (ret_status != NERR_Success)
{
printf("Net local group set info failed.\n");
return ret_status;
}
printf("Local group comment was changed.\n");
return 0;
}
Для додавання нових членів в локальну групу використовується функція NetLocalGroupAddMembers, Яка має наступний прототип:
NET_API_STATUS NetLocalGroupAddMembers(
LPCWSTR servername, // ім’я сервера
LPCWSTR groupname, // ім’я групи
DWORD level, // рівень інформації
LPBYTE buf, // буфер з інформацією
DWORD totalentries // кількість членів, що включаються
);
У разі успішного завершення функція NetLocalGroupAddMembers повертає значення NERR_success, а у разі невдачі можливі наступні коди завершення:
Параметри функції NetLocalGroupAddMembers мають наступне призначення.
Параметр servername повинен указувати на рядок з ім’ям сервера, на якому виконуватиметься функція. Цей рядок повинен мати кодування Unicode і починатися з символів \\. Якщо функція повинна виконуватися на локальному комп’ютері, то цей параметр повинен мати значення null.
Параметр groupname повинен указувати на рядок з ім’ям групи, в яку додаються нові члени. Цей рядок повинен мати кодування Unicode.
Параметр level указує тип структури, яка містить інформацію про членів, що додаються в групу. Цей параметр може приймати одне з наступних значень:
0 — використовується структура типу localgroup_members_info_0;
3 — використовується структура типу localgroup_members_info_3.
Параметр buf повинен указувати на буфер з інформацією про членів, які додаються в локальну групу. Інформація повинна зберігатися в структурах, тип яких заданий параметром level.
Параметр totaientries повинен містити розмірність масиву структур, на який указує параметр buf.
Тепер приведемо типи структур, на які може указувати параметр level.
Структура localgroup_members_info_o має наступний тип:
typedef struct _LOCALGROUP_MEMBERS_INFO_0 {
PSID lgrmi0_sid; // покажчик на ідентифікатор безпеки
} LOCALGROUP_MEMBERS_INFO_0, * PLOCALGROUP_MEMBERS_INFO_0,
*LPLOCALGROUP_MEMBERS_INFO_0 ;
У єдиному полі igrmi0_sid цієї структури зберігається покажчик на ідентифікатор безпеки члена, який додається в локальну групу.
Структура localgroup_members_info_3 має наступне визначення:
typedef struct _LOCALGROUP_MEMBERS_INFO_3 {
LPWSTR lgrmi3_domainandname; // покажчик на ім’я облікового запису
} LOCALGROUP_MEMBERS_INFO_3 , * PLOCALGROUP_MEMBERS_INFO_3 ,
*LPLOCALGROUP_MEMBERS_INFO_3 ;
У єдиному полі igrmi3_domainandname цієї структури зберігається покажчик на рядок з ім’ям облікового запису, який стає членом групи. Цей рядок повинен мати кодування Unicode, а ім’я повинне бути задане у форматі: <ім’я_домену>\ <ім’я_облікового_запису>.
Тепер перейдемо до прикладів. Спочатку, в лістингу 5, приведемо програму, яка додає члена локальної групи по його імені, використовуючи для цього функцію NetLocalGroupSetInfо.
Лістинг 5. Додавання члена локальної групи по імені
#include <stdio.h>
#include <windows.h>
#include <lm.h>
#pragma comment( lib, "netapi32.lib" ) // підключаємо мережеву бібліотеку
int main()
{
wchar_t server_name[256] = L"\\\\"; // ім’я сервера
wchar_t group_name[GNLEN]; // ім’я локальної групи
wchar_t user_name[UNLEN]; // ім'я користувача
LOCALGROUP_MEMBERS_INFO_3 member_info; // інформація про члена групи
NET_API_STATUS ret_status; // код повернення з функції
printf("Input server name: ");
// формуємо ім’я сервера
wscanf(L"%s", server_name + wcslen(server_name));
printf("Input a local group name: ");
wscanf(L"%s", group_name); // вводимо ім’я групи
printf("Input a domain name: ");
wscanf(L"%s", user_name); // вводимо ім’я домену
wcscat(user_name, L"\\"); // приєднуємо символ '\'
printf("Input а user name: ");
// вводимо ім'я користувача
wscanf(L"%s", user_name + wcslen(user_name));
// встановлюємо інформацію про користувача
member_info.lgrmi3_domainandname = user_name;
// додаємо користувача в локальну групу
ret_status = NetLocalGroupAddMembers(
server_name, // ім’я сервера
group_name, // ім’я групи
3, // рівень інформації
(LPBYTE)&member_info, // ім'я облікового запису
1); // додаємо одного члена групи
if (ret_status != NERR_Success)
{
printf("Ret status: %d\n", ret_status);
printf("Net local group add members failed.\n");
return ret_status;
}
printf("The member is added.\n");
return 0;
}
Тепер, в лістингу 6, приведемо програму, яка додає члена локальної групи по його ідентифікатору безпеки, використовуючи для цього функцію NetLocaiGroupSetmfo. Відмітимо, що в цій програмі ідентифікатор безпеки облікового запису визначається за допомогою функції LookupAccountName.
Лістинг 6. Додавання члена локальної групи по дескриптору безпеки
#ifndef UNICODE
#define UNICODE
#endif
#include <stdio.h>
#include <windows.h>
#include <lm.h>
#pragma comment( lib, "netapi32.lib" ) // підключаємо мережеву бібліотеку
int main()
{
wchar_t server_name[256] = L"\\\\"; // ім’я сервера
wchar_t group_name[GNLEN]; // ім’я локальної групи
wchar_t user_name[UNLEN]; // ім'я користувача
LOCALGROUP_MEMBERS_INFO_0 member_info; // інформація про члена групи
NET_API_STATUS ret_status; // код повернення з функції
DWORD dwErrCode;
DWORD dwLengthOfSID = 0; // довжина SID
DWORD dwLengthOfDomainName = 0; // довжина імені домену
PSID lpSID = NULL; // вказівник на SID
LPTSTR lpDomainName = NULL; // вказівник на ім’я домену
SID_NAME_USE type_of_SID; // тип облікового запису
printf("Input server name: ");
// формируем имя сервера
wscanf(L"%s", server_name + wcslen(server_name));
printf("Input a local group name: ");
wscanf(L"%s", group_name); // вводимо ім’я групи
printf("Input a user name: ");
wscanf(L"%s", user_name); // вводимо ім'я користувача
// визначаємо довжину SID користувача
LookupAccountName(
NULL, // шукаємо ім'я на
локальному комп'ютері user_name, // ім'я
користувача
NULL, // визначуваний довжину SID
&dwLengthOfSID, // довжина SID
NULL, // визначуваний ім'я домена
&dwLengthOfDomainName, // довжина імені домена
&type_of_SID); // тип облікового запису
// перевіряємо, чи повернула функція довжину SID
if (dwLengthOfSID == 0)
{
dwErrCode = GetLastError();
printf("Lookup account name failed.\n");
printf("Error code: %d\n", dwErrCode);
return dwErrCode;
}
// розподіляємо пам'ять для SID і імені домена
lpSID = (PSID) new char[dwLengthOfSID];
lpDomainName = (LPTSTR) new char[dwLengthOfDomainName];
// визначаємо SID і ім'я домена користувача
if(!LookupAccountName(
NULL, // шукаємо ім'я на локальному комп'ютері
user_name, // ім'я користувача
lpSID, // визначуваний довжину SID
&dwLengthOfSID, // довжина SID
lpDomainName, // визначуваний ім'я домена
&dwLengthOfDomainName, // довжина імені домена
&type_of_SID)) // тип облікового запису
{
dwErrCode = GetLastError();
printf("Lookup account name failed.\n");
printf("Error code: %d\n", dwErrCode);
return dwErrCode;
}
// роздруковуємо ім'я домена
wprintf(L"%s\n", lpDomainName);
// встановлюємо SID в інформацію про члена групи
member_info.lgrmi0_sid = lpSID;
// додаємо користувача в локальну групу
ret_status = NetLocalGroupAddMembers(
server_name, // ім'я сервера
group_name, // ім'я групи
0, // рівень інформації
(LPBYTE)&member_info, // інформація про SID
1); // додаємо одного члена групи
if (ret_status != NERR_Success)
{
printf("Net local group add members failed.\n");
return ret_status;
}
printf("The member is added.\n");
return 0;
}
Для видалення членів локальної групи використовується функція NetLocalGroupDelMembers, яка має наступний прототип:
NET_API_STATUS NetLocalGroupDelMembers(
LPCWSTR servername, // ім'я сервера
LPCWSTR groupname, // ім'я групи
DWORD level, // рівень інформації
LPBYTE buf, // буфер з інформацією
DWORD totalentries // кількість структур в буфері
);
У разі успішного завершення функція NetLocalGroupDelMembers повертає значення NERR_success, а у разі невдачі можливі наступні коди завершення:
У лістингу 7 приведена програма, яка видаляє члена локальної групи по імені за допомогою функції NetLocalGroupDelMembers.
Лістинг 7. Видалення члена локальної групи по імені
#include <stdio.h>
#include <windows.h>
#include <lm.h>
#pragma comment( lib, "netapi32.lib" ) // підключаємо мережеву бібліотеку
int main()
{
wchar_t server_name[256]= L"\\\\"; // ім'я сервера
wchar_t group_name[GNLEN]; // ім'я локальної групи
wchar_t user_name[UNLEN]; // ім'я користувача
LOCALGROUP_MEMBERS_INFO_3 member_info; // інформація про
члена групи
NET_API_STATUS ret_status; // код повернення з функції
printf("Input server name: ");
// формуємо ім'я сервера
wscanf(L"%s", server_name + wcslen(server_name));
printf("Input a local group name: ");
wscanf(L"%s", group_name); // вводимо ім'я групи
printf("Input а domain name: ");
wscanf(L"%s", user_name); // вводимо ім'я домена
wcscat(user_name, L"\\"); // приєднуємо символ '\'
printf("Input а user name: ");
// вводимо ім'я користувача
wscanf(L"%s", user_name + wcslen(user_name));
// встановлюємо інформацію про користувача
member_info.lgrmi3_domainandname = user_name;
// видаляємо користувача з локальної групи
ret_status = NetLocalGroupDelMembers(
server_name, // ім'я сервера
group_name, // ім'я групи
3, // рівень інформації
(LPBYTE)&member_info, // інформація
про SID
1); // додаємо одного члена групи
if (ret_status != NERR_Success)
{
printf("Net local group del members.\n");
return ret_status;
}
printf("The member is deleted.\n");
return 0;
}