Форум: "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