Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];

Вниз

Знатокам 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.04 c
3-1104926804
Marat
2005-01-05 15:06
2005.02.06
Блокировка сервера


1-1106690929
netmouse
2005-01-26 01:08
2005.02.06
Процедура закрытия формы


1-1106279118
Poha
2005-01-21 06:45
2005.02.06
AutoCad


3-1104360828
Soldier
2004-12-30 01:53
2005.02.06
Blob поля


4-1103178046
Dr. Genius
2004-12-16 09:20
2005.02.06
Инфо о модеме





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский