Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Управлять учётными записями программно

270
13 октября 2004 года
Drew
265 / / 20.07.2000
Возникла необходимость управлять учётными записями на сервере Windows 2000 из кода
Кто знает, гда достать информацию по этому вопросу, поделитесь пожалуйста.
1
16 октября 2004 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by Drew
Возникла необходимость управлять учётными записями на сервере Windows 2000 из кода
Кто знает, гда достать информацию по этому вопросу, поделитесь пожалуйста.


А необходимости юзанья справки и мсдн ни когда не возникала?:)
Посмотри userenv.h - там определены апи-функции для работы с окружением. И запусти МСДН платформ СДК - введи user - и будет тебе счастье. Там достаточно подробно описана работа с ком-объектами сервера и указаны ключи реестра.

270
16 октября 2004 года
Drew
265 / / 20.07.2000
Цитата:
Originally posted by kot_

А необходимости юзанья справки и мсдн ни когда не возникала?:)
Посмотри userenv.h - там определены апи-функции для работы с окружением. И запусти МСДН платформ СДК - введи user - и будет тебе счастье. Там достаточно подробно описана работа с ком-объектами сервера и указаны ключи реестра.



я уже разобрался... то есть разбираюсь... только надо было ввести NetApi...

270
16 октября 2004 года
Drew
265 / / 20.07.2000
но возникла иная проблема...
пытаюсь получить список локальных групп.
Вылазит Access Violation

проектик прицепил...
368
16 октября 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by Drew
но возникла иная проблема...
пытаюсь получить список локальных групп.
Вылазит Access Violation
проектик прицепил...


BYTE *buffer[4096];

скорей всего нужен

BYTE buffer[4096];

270
16 октября 2004 года
Drew
265 / / 20.07.2000
Цитата:
Originally posted by rostyslav

BYTE *buffer[4096];

скорей всего нужен

BYTE buffer[4096];



да. я тоже так подумал... у тебя получилось или предполагаешь?
У меня этот номер не прошёл...

368
16 октября 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by Drew

да. я тоже так подумал... у тебя получилось или предполагаешь?
У меня этот номер не прошёл...


У меня прога не компилируется под CBuilder. Требует каких-то библиотек.

Посмотрел в Visual C.

Нужен

BYTE *buffer;

buffer = new BYTE(4096);

Кроме этого, выдает сообщение, что totalEntries и EntriesRead используются без инициализации.

Определил их как норм. переменные и передал адрес.

ns равен 1722.

270
17 октября 2004 года
Drew
265 / / 20.07.2000
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
AnsiString ServerName="home";
//wchar_t wcServerName[20];
//wchar_t *pwcServerName=ServerName.WideChar(wcServerName,ServerName.WideCharBufSize());
//ServerName.WideChar(wcServerName,ServerName.WideCharBufSize());
unsigned long level=1;
BYTE *buffer=new BYTE[4096];
unsigned long *EntriesRead,*TotalEntries,prefMaxLen,*pdwResumeHandle;
NET_API_STATUS ns=NetLocalGroupEnum(L"home",level,&buffer,prefMaxLen,
EntriesRead,TotalEntries,NULL);
/*if(ns==NERR_Success)
for(unsigned int i=0;i<*EntriesRead;i++) groups->Lines->Add(AnsiString(*buffer));
else
ShowMessage("...");*/
delete buffer;

Access Violation
:( :(
368
17 октября 2004 года
rostyslav
629 / / 13.07.2004
Хорошо, но чему равен EntriesRead,TotalEntries?

Компилятор Visual C не видит определение NERR_Success. Случайно он не равен 1722?

Мимоходом. pdwResumeHandle не используется. Вместо него ты передаешь NULL. CBuilder и этого не замечает? Мне все равно, какая среда лучше, но Visual С пишет:

warning C4101: 'pdwResumeHandle' : unreferenced local variable
270
17 октября 2004 года
Drew
265 / / 20.07.2000
Цитата:
Originally posted by rostyslav
Хорошо, но чему равен EntriesRead,TotalEntries?

Компилятор Visual C не видит определение NERR_Success. Случайно он не равен 1722?


void __fastcall TMainForm::Button1Click(TObject *Sender)
{
AnsiString ServerName="home";
unsigned long level=1;
BYTE *buffer=(BYTE*)new BYTE[4096];
unsigned long EntriesRead,TotalEntries,prefMaxLen,*pdwResumeHandle;
NET_API_STATUS ns=NetLocalGroupEnum(L"home",level,&buffer,prefMaxLen,
(unsigned long*)EntriesRead,(unsigned long*)TotalEntries,NULL);
/*if(ns==NERR_Success)
for(unsigned int i=0;i<*EntriesRead;i++) groups->Lines->Add(AnsiString(*buffer));
else
ShowMessage("...");*/
delete buffer;
}

Теперь неинициализированных указателей нет, но результат тот же.
А что есть NERR_Success==1722 ? Просто я до него не дошёл пока: он у меня в комментариях...

270
17 октября 2004 года
Drew
265 / / 20.07.2000
ага! вот так
NET_API_STATUS ns=NetLocalGroupEnum(L"home",level,&buffer,prefMaxLen,
&EntriesRead,&TotalEntries,NULL);
сработало, но теперь надо разобраться, что за мусор в buffer.. надо полагать, там есть строки с именами групп...
368
17 октября 2004 года
rostyslav
629 / / 13.07.2004
Это наверно, как общение между японцем и китайцем. Твоя програ, если не ошибаюсь, требует Delphi, а он у меня установлен под другой операционкой.

1722 скорей всего не NERR_Success.

Вместо "home" в первом параметре я передал NULL и получил в ответ 2123 The API return buffer is too small.

но buffer[128000], то же вернул тот же код.

Надо тебе это? :)

Но если всерьез. То установив prefMaxLen в 2000 и
buffer[32000], ns = 0.
270
17 октября 2004 года
Drew
265 / / 20.07.2000
Цитата:
Originally posted by rostyslav
Это наверно, как общение между японцем и китайцем. Твоя програ, если не ошибаюсь, требует Delphi, а он у меня установлен под другой операционкой.

1722 скорей всего не NERR_Success.

Вместо "home" в первом параметре я передал NULL и получил в ответ 2123 The API return buffer is too small.

но buffer[128000], то же вернул тот же код.

Надо тебе это? :)

Но если всерьез. То установив prefMaxLen в 2000 и
buffer[32000], ns = 0.



NULL в первом параметре?... хм... не заню, определяет ли функция имя локального сервера по умолчанию....
функция КОРРЕКТНО вернула 10 групп, как и дОлжно, но в буфере .. не пойму что... это и не строки и не указатели... пробовал менять custing - безрезультатно...

270
17 октября 2004 года
Drew
265 / / 20.07.2000
Цитата:
Originally posted by rostyslav

результат записывается в unicode.


то есть в wchar_t?

270
17 октября 2004 года
Drew
265 / / 20.07.2000
теперь код выглядит так:
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
AnsiString ServerName="home";
LOCALGROUP_INFO_1 *line=NULL;
//wchar_t wcServerName[20];
//wchar_t *pwcServerName=ServerName.WideChar(wcServerName,ServerName.WideCharBufSize());
//ServerName.WideChar(wcServerName,ServerName.WideCharBufSize());
unsigned long level=1;
BYTE *buffer=new BYTE[128000];
//BYTE *buffer=new BYTE[4096];
unsigned long EntriesRead,TotalEntries,prefMaxLen=20,*pdwResumeHandle;
NET_API_STATUS ns=NetLocalGroupEnum(L"home",level,&buffer,prefMaxLen,
&EntriesRead,&TotalEntries,NULL);
if(ns==NERR_Success)
for(unsigned int i=0;i<EntriesRead;i++)
{
line =reinterpret_cast<LOCALGROUP_INFO_1*>(buffer);
//groups->Lines->Add(AnsiString(line));
}
else if(ns==ERROR_ACCESS_DENIED)
ShowMessage("Нет прав для получения групп");
else if(ns==NERR_InvalidComputer)
ShowMessage("Неправильное имя компа");
else if(ns==ERROR_MORE_DATA)
ShowMessage("Есть ещё записи");
else
ShowMessage("Хрен зна чё");
NetApiBufferFree(buffer);
//delete &buffer;
}

только теперь в ns возвращается код 2123
среди ошибок такого нет
368
17 октября 2004 года
rostyslav
629 / / 13.07.2004
2123 The API return buffer is too small

prefMaxLen нужно бы сделать больше.
270
17 октября 2004 года
Drew
265 / / 20.07.2000
Цитата:
Originally posted by rostyslav
2123 The API return buffer is too small

prefMaxLen нужно бы сделать больше.



ага! всё... дошло на третьи сутки :)

это должно быть так...

NET_API_STATUS ns=NetLocalGroupEnum(L"home",level,&buffer,MAX_PREFERRED_LENGTH,
&EntriesRead,&TotalEntries,NULL);

270
17 октября 2004 года
Drew
265 / / 20.07.2000
ИТОГО:


void __fastcall TMainForm::Button1Click(TObject *Sender)
{
AnsiString ServerName="home";
LOCALGROUP_INFO_1 *line=NULL;
unsigned long level=1;
BYTE *buffer=new BYTE[128000];
unsigned long EntriesRead,TotalEntries,*pdwResumeHandle;
NET_API_STATUS ns=NetLocalGroupEnum(L"home",level,&buffer,MAX_PREFERRED_LENGTH,
&EntriesRead,&TotalEntries,NULL);
if(ns==NERR_Success)
for(unsigned int i=0;i<EntriesRead;i++)
{
line =reinterpret_cast<LOCALGROUP_INFO_1*>(buffer);
groups->Lines->Add(AnsiString(line.lgrpi1_name));
}
else if(ns==ERROR_ACCESS_DENIED)
ShowMessage("Нет прав для чтения групп");
else if(ns==NERR_InvalidComputer)
ShowMessage("Неправильное имя компа");
else if(ns==ERROR_MORE_DATA)
ShowMessage("Есть ещё записи");
else if(ns=2123)
ShowMessage("Буфер API маловат");
NetApiBufferFree(buffer);
//delete &buffer; ???? не уверен
}
270
17 октября 2004 года
Drew
265 / / 20.07.2000
ну и окончательно

void __fastcall TMainForm::FormCreate(TObject *Sender)
{
ULONG_PTR lResume=0;
ULONG lTotal=0;
ULONG lReturned=0;
ULONG lIndex=0;
NET_API_STATUS netStatus;
LOCALGROUP_INFO_0* pinfoGroup;
do{
netStatus=NetLocalGroupEnum(L"home",0,(PBYTE*)&pinfoGroup,
MAX_PREFERRED_LENGTH,&lReturned,&lTotal,&lResume);
if((netStatus==ERROR_MORE_DATA) ||
(netStatus==NERR_Success)) {
for(lIndex=0;lIndex < lReturned;lIndex++){
groups->Lines->Add(pinfoGroup[lIndex].lgrpi0_name);
}
NetApiBufferFree(pinfoGroup);
}
}while(netStatus == ERROR_MORE_DATA);
}
1
18 октября 2004 года
kot_
7.3K / / 20.01.2000
Вот то что я накопал - во первых M$ не рекомендует использовать функцию NetLocalGroupEnum и прочие а вызывать NetQueryDisplayInformation.

Код:
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
int level =1; //Левел и сервер выствлены в ручную для локальных групп - сервер соответственно в NULL
void *buf;
NET_DISPLAY_USER *ndu;
NET_DISPLAY_MACHINE *ndm;
NET_DISPLAY_GROUP *ndg;
DWORD read, next_index, rc, i;
next_index = 0;
do
{
buf = NULL;
rc = NetQueryDisplayInformation( NULL, 1, next_index, 10, 1024, &read, &buf );
if ( rc != ERROR_MORE_DATA && rc != ERROR_SUCCESS )
break;
switch ( level )
        {
            case 1: // users
                for ( i = 0, ndu = (NET_DISPLAY_USER *) buf; i < read; ++ i, ++ ndu )
                                                groups->Lines->Add("%-40.40S (group)\n"+ WideCharToString(ndu->usri1_name));
if ( read > 0 )
next_index = ((NET_DISPLAY_USER *)buf)[read - 1].usri1_next_index;
break;
case 2: // machines
for ( i = 0, ndm = (NET_DISPLAY_MACHINE *) buf; i < read; ++ i, ++ ndm )
groups->Lines->Add("%-40.40S ()\n"+ WideCharToString(ndm->usri2_name));
if ( read > 0 )
next_index = ((NET_DISPLAY_MACHINE *)buf)[read - 1].usri2_next_index;
break;
case 3: // groups
for ( i = 0, ndg = (NET_DISPLAY_GROUP *) buf; i < read; ++ i, ++ ndg )
groups->Lines->Add("%-40.40S (group)\n"+ WideCharToString(ndg->grpi3_name));
if ( read > 0 )
next_index = ((NET_DISPLAY_GROUP *)buf)[read - 1].grpi3_next_index;
break;
}
if ( buf != NULL )
NetApiBufferFree( buf );
} while ( rc == ERROR_MORE_DATA );
}
1
18 октября 2004 года
kot_
7.3K / / 20.01.2000
А вот еще вариант с NetLocalGroupEnum.
Код:
#include <windows.h>
#include <lm.h>
#include <stdio.h>
#include <stdlib.h>
#pragma hdrstop
#define MAXLEN 256
int main( int argc, char *argv[] )
{
    LOCALGROUP_INFO_1 *buf, *cur;
    DWORD read, total, resumeh, rc, i;
    wchar_t server[MAXLEN];
    if ( argc != 2 )
    {
    puts( "usage: nlge \\\\server" );
    return 1;
    }
    mbstowcs( server, argv[1], MAXLEN );
    resumeh = 0;
    do
    {
    buf = NULL;
    rc = NetLocalGroupEnum( server, 1, (BYTE **) &buf,512, &read, &total, &resumeh );       if ( rc != ERROR_MORE_DATA && rc != ERROR_SUCCESS )
break;

printf( "\ngot %lu entries out of %lu remaining\n", read, total );
printf( "%-20.20s %.58s\n", "local group name","comment" );
printf( "%-20.20s %-58.58s\n", "--------------------",      "----------------------------------------------------------" );
for ( i = 0, cur = buf; i < read; ++ i, ++ cur )
{
// Note: the capital S in the format string will expect Unicode
// strings, as this is a program written/compiled for ANSI.
printf( "%-20.20S %.58S\n", cur->lgrpi1_name, cur->lgrpi1_comment );
}
if ( buf != NULL )
NetApiBufferFree( buf );
} while ( rc == ERROR_MORE_DATA );
if ( rc != ERROR_SUCCESS )
printf( "NLGE() returned %lu\n", rc );
return 0;
}
270
18 октября 2004 года
Drew
265 / / 20.07.2000
Цитата:
Originally posted by kot_
Вот то что я накопал - во первых M$ не рекомендует использовать функцию NetLocalGroupEnum и прочие а вызывать NetQueryDisplayInformation.



.. и почему же она-таки используется?
я на работе попробовал своё (ну не совсем правда...) на локалке - работает нормально. Теперь надо нарыть, как блокировать и разблокировать учётные записи ползателей...

1
18 октября 2004 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by Drew


.. и почему же она-таки используется?
я на работе попробовал своё (ну не совсем правда...) на локалке - работает нормально. Теперь надо нарыть, как блокировать и разблокировать учётные записи ползателей...


Работа с пользователями идет через _USER_INFO_1008 например, это если надо блокировать и разблокировать используя функцию NetUserSetInfo

1
18 октября 2004 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by Drew


.. и почему же она-таки используется?


Почему Виндоус не распространяется бесплатно? Почему поодерживаются три версии ядра? Мало ли почему можно задать. Спроси у Билли

:)
The NetQueryDisplayInformation and NetGetDisplayInformationIndex functions provide a very efficient mechanism for enumerating User and Global group accounts.

270
18 октября 2004 года
Drew
265 / / 20.07.2000
Цитата:
Originally posted by kot_

Почему Виндоус не распространяется бесплатно? Почему поодерживаются три версии ядра? Мало ли почему можно задать. Спроси у Билли

:)
The NetQueryDisplayInformation and NetGetDisplayInformationIndex functions provide a very efficient mechanism for enumerating User and Global group accounts.



гыгыгы! Я смотрю, ты штудируешь те же книженции, что и я: Дж. Рихтер и Кларк - Программирование серверных приложений для Windows 2000...

246
19 октября 2004 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by rostyslav

У меня прога не компилируется под CBuilder. Требует каких-то библиотек.

Посмотрел в Visual C.


Не смотри в Visual C, смотри здесь...
$(BCB)\LIB\PSDK

1
19 октября 2004 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by Drew


гыгыгы! Я смотрю, ты штудируешь те же книженции, что и я: Дж. Рихтер и Кларк - Программирование серверных приложений для Windows 2000...


А у тебя в электронном виде нет часом?

1
19 октября 2004 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by GIZMO

Не смотри в Visual C, смотри здесь...
$(BCB)\LIB\PSDK


Библиотека нужна только одна - netapi32.lib

246
19 октября 2004 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by kot_

Библиотека нужна только одна - netapi32.lib


Непонял.

1
19 октября 2004 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by GIZMO

Непонял.


Чего не понял? Что бы проект у него откомпилировался нужна netapi32.lib - именно в ней реализованы эти функции.

246
19 октября 2004 года
GIZMO
1.8K / / 30.07.2004
А-А-А-А это поликлинника!

Цитата:
Originally posted by kot_

Чего не понял?


Фразу: - "Библиотека нужна только одна - netapi32.lib"
Зачем ты мне это говоришь? Я это знаю. Поэтому и говорю человеку загляни в $(BCB)\LIB\PSDK она (netapi32.lib) там.

Вам в кабинет 22!

368
19 октября 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by GIZMO
А-А-А-А это поликлинника!
Фразу: - "Библиотека нужна только одна - netapi32.lib"
Зачем ты мне это говоришь? Я это знаю. Поэтому и говорю человеку загляни в $(BCB)\LIB\PSDK она (netapi32.lib) там.
Вам в кабинет 22!

Drew писал на BCB6, как теперь посмотрел, а у меня BCB5й. Нет библиотеки, напр.ADORTL.LIB b и нет каких-то пакетов импорта.
В Visual C, я проверял код, а не библиотеку искал.

368
19 октября 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by kot_

А у тебя в электронном виде нет часом?


Есть. 5.8 Мб. Или вместе с примерами 6.68 Мб.

246
19 октября 2004 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by rostyslav
Drew писал на BCB6, как теперь посмотрел, а у меня BCB5й. Нет библиотеки, напр.ADORTL.LIB b и нет каких-то пакетов импорта.
В Visual C, я проверял код, а не библиотеку искал.


S_OK. Я поленился аттач открыть и давай советовать (хотя лучше конечно уточнять - каких библиотек он требует).
Не хочу показатся назойливым, но руки так и чешутся дать новый совет - Project|Edit Option Source и поработай над секцией <PACKAGES value=.

368
19 октября 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by GIZMO

S_OK. Я поленился аттач открыть и давай советовать (хотя лучше конечно уточнять - каких библиотек он требует).


attach, это не мой attach. Его прикрепил Drew. Это его проект.

Цитата:

Не хочу показатся назойливым, но руки так и чешутся дать новый совет - Project|Edit Option Source и поработай над секцией <PACKAGES value=.


А не думаешь, что указать например <IMPORT PACKAGES value=vcl.bpi....> мало если на компе нет такого пакета?
Но все это мелочи жизни. Главное, что проект компилируется на компе того, кто пишет этот проект. :)

1
19 октября 2004 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by rostyslav

Есть. 5.8 Мб. Или вместе с примерами 6.68 Мб.


Ну так давай дружить....:) Выложи где нибудь, если не жалко, или закинь на kostya#rigel.com.ua. По мегу разбей в архиве на всякий случай.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог