Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.06;
Скачать: CL | DM;

Вниз

Знатокам NetApi (NetUserSetInfo )   Найти похожие ветки 

 
sql   (2004-12-17 13:53) [0]

Доброго всем времени суток!
Не работает NetUserSetInfo c USER_INFO_1005 (Изменение принадлежности к группе(юзер-админ))
ERROR_INVALID_PARAMETER (87)
При этом очень схожая ситуция :
NetUserSetInfo(FWAddrSlashed,LPWSTR(user),1003,@uinfo,@parm_err);
работает нормально.

Пытался буфер выделять динамически - результат тот же.
Слыхал , что ERROR_INVALID_PARAMETER, иногда может быть следствием недостаточности прав в системе, и дал аккаунту, под которым работаю все привилегии(разрешающие, конечно) - все равно не работает.

Вот кусок кода, что не так?
Заголовки функций и описание структур опущены.

procedure TFrmTest.btnCreateNewUserClick(Sender: TObject);
var
userInfo   : TUserInfo1;
puserInfo5 : TUserInfo5;
Status     : DWORD;
NeedRet    : DWORD;
wAdmUser  : WideString;
wAdmPassw : WideString;
wAdmDescr : WideString;
begin
NeedRet := 0;
wAdmUser  := "NEWUSRMACHINE";
wAdmPassw := "PasswordX";
wAdmDescr := "The description";

with userInfo do begin
 usri1_name        := LPWSTR(wAdmUser);
 usri1_password    := LPWSTR(wAdmPassw);
 usri1_comment     := LPWSTR(wAdmDescr);
 usri1_flags       := UF_SCRIPT;
 usri1_priv        := USER_PRIV_USER;
 usri1_home_dir    := nil;
 usri1_script_path := nil;
end;
Status := NetUserAdd(nil,1,@userInfo,nil);
  if (Status <> ERROR_SUCCESS) and (Status <> NERR_UserExists) then begin
   exit;
  end else begin
// До этого места все работает нормально...
    puserInfo5.usri1005_priv := USER_PRIV_ADMIN
{если USER_PRIV_USER - тоже не работает};
   Status := NetUserSetInfo(nil,LPWSTR(wAdmUser),1005,@puserInfo5,@NeedRet);
    if (Status <> ERROR_SUCCESS) then begin
    end;
end;
end;


 
BiN ©   (2004-12-17 15:11) [1]

MSDN неоднозначно говорит о так называемом уровне привилегий пользователя в сети (не путать с привилегиями учетных записей).
В описании структуры USER_INFO_1 в связи с функцией NetUserSetInfo говорится следующие:

"Specifies a DWORD value that indicates the level of privilege assigned to the usri1_name member. When you call the NetUserAdd function, this member must be USER_PRIV_USER. When you call the NetUserSetInfo function, this member must be the value returned by the NetUserGetInfo function or the NetUserEnum function"

т.е. подразумевается, что изменить этот параметр нельзя.

В описании USER_INFO_1005 об этом ограничении не сказано ничего.
Вероятно MS оставило возможность передачи USER_INFO_1005 в  качестве параметра в функцию NetUserSetInfo по соображениям совместимости.

sql   (17.12.04 13:53)  
Не работает NetUserSetInfo c USER_INFO_1005 (Изменение принадлежности к группе(юзер-админ))
ERROR_INVALID_PARAMETER (87)


USER_INFO_1005 не имеет прямого отношения к группам пользователей. Корректнее использовать NetGroupAddUser.
Кстати, в примере я не увидел обработку NeedRet - именно там в случае ошибки  ERROR_INVALID_PARAMETER и будет индекс ошибочно заданного элемента структуры USER_INFO_ххх. В твоем случае этот индеск видимо равен USER_PRIV_PARMNUM


 
sql   (2004-12-17 15:29) [2]

Спасибо, BiN

А я имел ввиду именно привилегии доверенных объектов(в т ч учетных записей). Случалось уже , что некоторые операции не выполнялись из-за невключенности привилегий. Это зависимость не всегда явная. В книжке прочитал, что многие GUI-диалоги содержат под собой код, который на времы своей работы включает некоторые привилегии, а потом возвращает все в исходное состояние. Возможно, это не текущий случай.

Кстати, NeedRet возвращает 5.

NetLocalGroupAddMembers у меня работает, но , к сожалению, это не совсем то. Группу ведь можно переименовать.


 
sql   (2004-12-17 15:30) [3]

Удалено модератором
Примечание: Дубль


 
sql   (2004-12-17 15:30) [4]

Удалено модератором
Примечание: Дубль


 
sql   (2004-12-17 15:31) [5]

Удалено модератором
Примечание: Дубль


 
BiN ©   (2004-12-17 15:37) [6]

NetLocalGroupAddMembers у меня работает, но , к сожалению, это не совсем то. Группу ведь можно переименовать.

Доверенные объекты можно иднтифицировать не только по имени (которое, как ты заметил, можно изменить), но по RID-ам.


 
sql   (2004-12-17 15:58) [7]

BiN, Понимаешь, какая штука среди всех структур типа GROUP_INFO_XXX, только GROUP_INFO_1 относится к локальным группам, все остальные структуры описывают глобальные. И именно все остальные содержат grpiX_group_id. У меня сеть без доменов. Функции перечисления групп не возвращают ничего, если только буфер не ссылается на GROUP_INFO_1. А тот не имеет grpiX_group_id


 
BiN ©   (2004-12-17 16:14) [8]

sql   (17.12.04 15:58) [7]

RID-ы можно проверить, имея идентификаторы безопасности доверенных объектов. Поучить последние можно и в бездоменной сети. Для этого, зная имя дов. объекта, нужно воспользоваться ф-ей LookupAccountName.


 
sql   (2004-12-17 16:15) [9]

Фигню я написал в предыдущем посте. SID конечно же можно получить по имени группы. Потом выдернуть из него RID. Это будет работать. Просто хотелось бы как-нибудь попроще. Вообще простая ведь ситуация: я программно создаю пользователя и хочу что бы он имел админские права в системе. Задача ведь понятная, и не экзотическая. Такие задачи должны решаться попроще.


 
BiN ©   (2004-12-17 16:19) [10]

sql   (17.12.04 16:15) [9]
Вообще простая ведь ситуация: я программно создаю пользователя и хочу что бы он имел админские права в системе. Задача ведь понятная, и не экзотическая. Такие задачи должны решаться попроще.


Что ж, это спорный и оффтопный вопрос :)

с уважением



Страницы: 1 вся ветка

Текущий архив: 2005.02.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.047 c
1-1106311935
Yr2
2005-01-21 15:52
2005.02.06
Протокол работы PC с мобильным телефоном


14-1105704415
Santa][P
2005-01-14 15:06
2005.02.06
COPDZone


1-1106174256
ROMBLLER
2005-01-20 01:37
2005.02.06
как из dll вставить фрейм в форму программы...


3-1104391722
atruhin
2004-12-30 10:28
2005.02.06
Перенос БД с Firebird 1.5 на Interbase 5.6


1-1106221314
Dimedrol
2005-01-20 14:41
2005.02.06
Как записать XLS-файл ?