Управлять учётными записями программно
Кто знает, гда достать информацию по этому вопросу, поделитесь пожалуйста.
Возникла необходимость управлять учётными записями на сервере Windows 2000 из кода
Кто знает, гда достать информацию по этому вопросу, поделитесь пожалуйста.
А необходимости юзанья справки и мсдн ни когда не возникала?:)
Посмотри userenv.h - там определены апи-функции для работы с окружением. И запусти МСДН платформ СДК - введи user - и будет тебе счастье. Там достаточно подробно описана работа с ком-объектами сервера и указаны ключи реестра.
А необходимости юзанья справки и мсдн ни когда не возникала?:)
Посмотри userenv.h - там определены апи-функции для работы с окружением. И запусти МСДН платформ СДК - введи user - и будет тебе счастье. Там достаточно подробно описана работа с ком-объектами сервера и указаны ключи реестра.
я уже разобрался... то есть разбираюсь... только надо было ввести NetApi...
пытаюсь получить список локальных групп.
Вылазит Access Violation
проектик прицепил...
но возникла иная проблема...
пытаюсь получить список локальных групп.
Вылазит Access Violation
проектик прицепил...
BYTE *buffer[4096];
скорей всего нужен
BYTE buffer[4096];
BYTE *buffer[4096];
скорей всего нужен
BYTE buffer[4096];
да. я тоже так подумал... у тебя получилось или предполагаешь?
У меня этот номер не прошёл...
да. я тоже так подумал... у тебя получилось или предполагаешь?
У меня этот номер не прошёл...
У меня прога не компилируется под CBuilder. Требует каких-то библиотек.
Посмотрел в Visual C.
Нужен
BYTE *buffer;
buffer = new BYTE(4096);
Кроме этого, выдает сообщение, что totalEntries и EntriesRead используются без инициализации.
Определил их как норм. переменные и передал адрес.
ns равен 1722.
{
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
:( :(
Компилятор Visual C не видит определение NERR_Success. Случайно он не равен 1722?
Мимоходом. pdwResumeHandle не используется. Вместо него ты передаешь NULL. CBuilder и этого не замечает? Мне все равно, какая среда лучше, но Visual С пишет:
warning C4101: 'pdwResumeHandle' : unreferenced local variable
Хорошо, но чему равен 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 ? Просто я до него не дошёл пока: он у меня в комментариях...
NET_API_STATUS ns=NetLocalGroupEnum(L"home",level,&buffer,prefMaxLen,
&EntriesRead,&TotalEntries,NULL);
сработало, но теперь надо разобраться, что за мусор в buffer.. надо полагать, там есть строки с именами групп...
1722 скорей всего не NERR_Success.
Вместо "home" в первом параметре я передал NULL и получил в ответ 2123 The API return buffer is too small.
но buffer[128000], то же вернул тот же код.
Надо тебе это? :)
Но если всерьез. То установив prefMaxLen в 2000 и
buffer[32000], ns = 0.
Это наверно, как общение между японцем и китайцем. Твоя програ, если не ошибаюсь, требует 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 - безрезультатно...
результат записывается в unicode.
то есть в wchar_t?
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
среди ошибок такого нет
prefMaxLen нужно бы сделать больше.
2123 The API return buffer is too small
prefMaxLen нужно бы сделать больше.
ага! всё... дошло на третьи сутки :)
это должно быть так...
NET_API_STATUS ns=NetLocalGroupEnum(L"home",level,&buffer,MAX_PREFERRED_LENGTH,
&EntriesRead,&TotalEntries,NULL);
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; ???? не уверен
}
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);
}
{
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 );
}
#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;
}
Вот то что я накопал - во первых M$ не рекомендует использовать функцию NetLocalGroupEnum и прочие а вызывать NetQueryDisplayInformation.
.. и почему же она-таки используется?
я на работе попробовал своё (ну не совсем правда...) на локалке - работает нормально. Теперь надо нарыть, как блокировать и разблокировать учётные записи ползателей...
.. и почему же она-таки используется?
я на работе попробовал своё (ну не совсем правда...) на локалке - работает нормально. Теперь надо нарыть, как блокировать и разблокировать учётные записи ползателей...
Работа с пользователями идет через _USER_INFO_1008 например, это если надо блокировать и разблокировать используя функцию NetUserSetInfo
.. и почему же она-таки используется?
Почему Виндоус не распространяется бесплатно? Почему поодерживаются три версии ядра? Мало ли почему можно задать. Спроси у Билли
:)
The NetQueryDisplayInformation and NetGetDisplayInformationIndex functions provide a very efficient mechanism for enumerating User and Global group accounts.
Почему Виндоус не распространяется бесплатно? Почему поодерживаются три версии ядра? Мало ли почему можно задать. Спроси у Билли
:)
The NetQueryDisplayInformation and NetGetDisplayInformationIndex functions provide a very efficient mechanism for enumerating User and Global group accounts.
гыгыгы! Я смотрю, ты штудируешь те же книженции, что и я: Дж. Рихтер и Кларк - Программирование серверных приложений для Windows 2000...
У меня прога не компилируется под CBuilder. Требует каких-то библиотек.
Посмотрел в Visual C.
Не смотри в Visual C, смотри здесь...
$(BCB)\LIB\PSDK
гыгыгы! Я смотрю, ты штудируешь те же книженции, что и я: Дж. Рихтер и Кларк - Программирование серверных приложений для Windows 2000...
А у тебя в электронном виде нет часом?
Не смотри в Visual C, смотри здесь...
$(BCB)\LIB\PSDK
Библиотека нужна только одна - netapi32.lib
Библиотека нужна только одна - netapi32.lib
Непонял.
Непонял.
Чего не понял? Что бы проект у него откомпилировался нужна netapi32.lib - именно в ней реализованы эти функции.
Чего не понял?
Фразу: - "Библиотека нужна только одна - netapi32.lib"
Зачем ты мне это говоришь? Я это знаю. Поэтому и говорю человеку загляни в $(BCB)\LIB\PSDK она (netapi32.lib) там.
Вам в кабинет 22!
А-А-А-А это поликлинника!
Фразу: - "Библиотека нужна только одна - netapi32.lib"
Зачем ты мне это говоришь? Я это знаю. Поэтому и говорю человеку загляни в $(BCB)\LIB\PSDK она (netapi32.lib) там.
Вам в кабинет 22!
Drew писал на BCB6, как теперь посмотрел, а у меня BCB5й. Нет библиотеки, напр.ADORTL.LIB b и нет каких-то пакетов импорта.
В Visual C, я проверял код, а не библиотеку искал.
А у тебя в электронном виде нет часом?
Есть. 5.8 Мб. Или вместе с примерами 6.68 Мб.
Drew писал на BCB6, как теперь посмотрел, а у меня BCB5й. Нет библиотеки, напр.ADORTL.LIB b и нет каких-то пакетов импорта.
В Visual C, я проверял код, а не библиотеку искал.
S_OK. Я поленился аттач открыть и давай советовать (хотя лучше конечно уточнять - каких библиотек он требует).
Не хочу показатся назойливым, но руки так и чешутся дать новый совет - Project|Edit Option Source и поработай над секцией <PACKAGES value=.
S_OK. Я поленился аттач открыть и давай советовать (хотя лучше конечно уточнять - каких библиотек он требует).
attach, это не мой attach. Его прикрепил Drew. Это его проект.
Не хочу показатся назойливым, но руки так и чешутся дать новый совет - Project|Edit Option Source и поработай над секцией <PACKAGES value=.
А не думаешь, что указать например <IMPORT PACKAGES value=vcl.bpi....> мало если на компе нет такого пакета?
Но все это мелочи жизни. Главное, что проект компилируется на компе того, кто пишет этот проект. :)
Есть. 5.8 Мб. Или вместе с примерами 6.68 Мб.
Ну так давай дружить....:) Выложи где нибудь, если не жалко, или закинь на kostya#rigel.com.ua. По мегу разбей в архиве на всякий случай.