При закрытии подписчики были переданы в рассылку "Delphi - проблемы и решения" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Информационный Канал Subscribe.Ru |
[...] в функции AddUser допущена ошибка, вместо строк lpwSrv := Str2Wide(Comp.Text); // Имя компьютера Res:= NetUserAdd(nil,1,@User,@dwErr); должно быть lpwSrv := Str2Wide(Comp.Text); // Имя компьютера Res:= NetUserAdd(lpwSrv,1,@User,@dwErr); (то есть в качестве имени сервера передаем имя, а не nil) С уважением, Дмитрий ЗаузолковСпасибо Дмитрию за замечание. Ошибка получилась из за того, что в исходниках было или nil или имя сервера, и переделывалось все уже при подготовке рассылки. Пришу извенить за подобные ошибки.
uses LmApiBuf,LmAccess; procedure EnumGroupUsers(lpwServer,lpwGroup: PWideChar); type TUserGroupArray = array of GROUP_USERS_INFO_0; const // Размер выделяемого буфера PREF_LEN = 1024; var pBuffer:Pointer; // Указатель на наш буфер Res,dwRead,dwTotal,hRes,i:Cardinal; begin hRes:=0; ListBox1.Clear; //Будем выводить результат в ListBox, а пока очищаем его repeat // Перечисляем пользователей группы lpwGroup на компютере lpwServer Res:=NetGroupGetUsers(lpwServer,lpwGroup,0,pBuffer,PREF_LEN,dwRead,dwTotal,@hRes); //В случае удачи результат может быть или ERROR_SUCCESS (все данные получены) // или ERROR_MORE_DATA - будем еще перечислять if (Res=0) or (Res=ERROR_MORE_DATA) then begin for i:=0 to dwRead-1 do // Вывод списка ListBox1.Items.Add(TUserGroupArray(pBuffer)[i].grui0_name); NetApiBufferFree(pBuffer); end; until Res<>ERROR_MORE_DATA; end;Теперь узнаем, в каких группах находится определенный пользователь. Для этого можно перечислить всех пользователей во всех группах, и найти те, в которых есть нужный нам пользователь (видел я такую реализацию :)) Но мы воспользуемся функциями NetUserGetGroups и NetUserGetLocalGroups.
procedure GetUserGroups(lpwServer,lpwUser : PWideChar); type TUserGroupArray = array of GROUP_USERS_INFO_0; var Res : Cardinal; pBuffer : Pointer; dwRead,dwTotal,i:Cardinal; begin Res:=NetUserGetGroups(lpwServer,lpwUser,0,pBuffer,Cardinal(-1),dwRead,dwTotal); if Res<>0 then Exit; for i:=0 to dwRead-1 do ListBox1.Items.Add(TUserGroupArray(pBuffer)[i].grui0_name); NetApiBufferFree(pBuffer); end;
procedure GetUserLocalGroups(lpwServer,lpwUser : PWideChar); type TLocalGroupArray = array of LOCALGROUP_USERS_INFO_0; var pBuffer : Pointer; cbRead,cbTotal,Res,i : Cardinal; begin Res:= NetUserGetLocalGroups(lpwServer,lpwUser,0,LG_INCLUDE_INDIRECT , pBuffer,Cardinal(-1),cbRead,cbTotal); if Res<>0 then Exit; ListBox1.Clear; for i:=0 to cbRead-1 do ListBox1.Items.Add(TLocalGroupArray(pBuffer)[i].lgrui0_name); NetApiBufferFree(pBuffer); end;
procedure AddDelUsersToGroup(lpwServer,lpwGroup : PWideChar); type TGroupInfoArray = array of LOCALGROUP_MEMBERS_INFO_0; var pBuffer : TGroupInfoArray; Res : Cardinal; Users : TStringList; i : Integer; begin // Создаем TStringList (можно было его позаимствовать у другого класса) // И добавляем имена пользователей, которых мы добавим в группу Users:=TStringList.Create; Users.Add('user1'); users.Add('user2'); Users.Add('User3'); // В этом примере у нас pBuffer (по определению) не указатель, а массив // Назначаем его новый размер SetLength(pBuffer,Users.Count); // Получаем SID по имени пользователя // Функция GetUserSid будет обсуждаться ниже For i:=0 to Users.Count-1 do begin GetUserSid(lpwServer,Users.Strings[i],pBuffer[i].lgrmi0_sid); end; // Добавляем пользователей Res:= NetLocalGroupAddMembers(lpwServer,lpwGroup,0,pBuffer,Users.Count); // ИЛИ удаляем их Res:= NetLocalGroupDelMembers(lpwServer,lpwGroup,0,pBuffer,Users.Count); ShowMessage(SysErrorMessage(Res)); // Очищаем занятую функцией GetUserSid память For i:=0 to Users.Count-1 do FreeMem(pBuffer[i].lgrmi0_sid); Users.Free; end;
procedure GetUserSid(lpwServer: PWideChar; sUser:String; var pSid:PSID); var lpDomain : PWideChar; cbDomain,cbSid : Cardinal; lpwUser : PWideChar; cbUser : Cardinal; peUse : Cardinal; begin // Переводим имя пользователя в Unicode cbUser := Length(sUser); cbUser:=(cbUser+1)*2; GetMem(lpwUser,cbUser); StringToWideChar(sUser,lpwUser,cbUser); cbSid:=0; cbDomain:=0; if not LookupAccountNameW(lpwServer,lpwUser,nil,cbSid,nil,cbDomain, peUse) and (GetLastError=122) then begin GetMem(pSid,cbSid); GetMem(lpDomain,cbDomain*2); if not LookupAccountNameW(lpwServer,lpwUser,pSid,cbSid,lpDomain,cbDomain,peUse) then ShowMessage('LookupAccountNameW'#13#10+SysErrorMessage(GetLastError)); FreeMem(lpDomain); FreeMem(lpwUser); end; end;
procedure GetLocalGroupUsers(lpwServer,lpwGroup : PWideChar); type TUserArray = array of LOCALGROUP_MEMBERS_INFO_1; var pBuffer : Pointer; cbRead,cbTotal,Res,hRes : Cardinal; i:Integer; begin hRes:=0; repeat Res:=NetLocalGroupGetMembers(lpwServer,lpwGroup,1,pBuffer,1024,cbRead,cbTotal,@hRes); if (Res=0) or (Res=ERROR_MORE_DATA) then begin for i:=0 to cbRead-1 do ListBox1.Items.Add(TUserArray(pBuffer)[i].lgrmi1_name); NetApiBufferFree(pBuffer); end; until Res<>ERROR_MORE_DATA; end;
procedure CopyGroupMembers(lpwServer1,lpwGroup1,lpwServer2,lpwGroup2 : PWideChar); var pBuffer : Pointer; cbRead,cbTotal : Cardinal; begin if NetLocalGroupGetMembers(lpwServer1,lpwGroup1,0,pBuffer,Cardinal(-1), cbRead,cbTotal,nil)=0 then NetLocalGroupSetMembers(lpwServer2,lpwGroup2,0,pBuffer,cbRead); end;
procedure ClearGroup(lpwServer,lpwGroup : PWideChar); begin NetLocalGroupSetMembers(lpwServer,lpwGroup,0,nil,0) end;Еще раз напомню - все строки в Net функциях только в Unicode (как перевести String в Unicode можно посмотреть в начале функции GetUserSid). Заголовочные файлы можно скачать отсюда [300Kb].
function GetUserContext(dwPid : Cardinal):Boolean; var hProc : THandle; hToken : THandle; User : array [0..100] of Char; cbUser : Cardinal; begin Result:=false; hProc:=OpenProcess(PROCESS_ALL_ACCESS,false,dwPid); if hProc = 0 then Exit; if not OpenProcessToken(hProc,TOKEN_DUPLICATE or TOKEN_QUERY ,hToken) then Exit; if not ImpersonateLoggedOnUser(hToken) then Exit; // С этого момента код будет выполняться в // Контексте пользователя, под которым запущен // процесс c PID = dwPID cbUser:=100; GetUserName(User,cbUser); ShowMessage(User); RevertToSelf; // Теперь снова работаем под системой cbUser:=100; GetUserName(User,cbUser); ShowMessage(User); Result:=true; end;
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||