|
|
|
|
Список пользователей | ☑ | ||
|---|---|---|---|---|
|
0
Press
15.10.04
✎
13:42
|
Можно ли, штатно, не используя ГМ, получить список пользователей конфигурции. Если можно, то, естественно, очень интересует как?
|
|||
|
1
Crew
15.10.04
✎
13:44
|
поиск сделать лень?
|
|||
|
2
F427
15.10.04
✎
13:44
|
А спросить в отделе кадров уже не канает?
Обязательно в ГМ переться? Кстати, а что такое ГМ? |
|||
|
3
Press
15.10.04
✎
13:53
|
(1) А прочитать внимательно вопрос лень?
(2) Не канает, написал обработочку позволяющую удобно группировать внешние отчеты, хочу сделать разграничение доступа по пользователям, но для этого мне нужно получить их список. |
|||
|
4
Press
15.10.04
✎
13:54
|
+(3) ГМ - глобальный модуль
|
|||
|
5
Crew
15.10.04
✎
13:56
|
(3)
В твоем случае ГМ переводится иначе г...на мешок. |
|||
|
6
Последний Будда
15.10.04
✎
13:57
|
users.usr - парсить.
|
|||
|
7
Press
15.10.04
✎
13:58
|
(6) Как? Используя объект "Текст" не получается.
|
|||
|
8
GrayT
15.10.04
✎
14:08
|
Если конфа стандартная не проще использовать справочник Пользователи?
|
|||
|
9
Press
15.10.04
✎
14:12
|
(8) Нужно универсальное, внешнее решение.
|
|||
|
10
Просто BorisG
15.10.04
✎
14:14
|
Мда......
(9) А все же... возвращаясь к (1)... искать по форуму совсем лень? |
|||
|
11
Press
15.10.04
✎
14:20
|
(10) А сам пробывал?
|
|||
|
12
Crew
15.10.04
✎
14:25
|
(3)
Накуй получать список пользователей для разграничения??? к тому же на разных конфигурациях? |
|||
|
13
Просто BorisG
15.10.04
✎
14:26
|
(11) А я знаю ответ. И сам автор не далее, как вчера сюда объявился.
|
|||
|
14
MMF
15.10.04
✎
14:34
|
Можно, абсолютно без использования ГМ.
unit UsrWork; interface uses SysUtils, Classes, CompoundFiles, Global, ActiveX, Math; type TUserDetail = record PageName: string; UserName: string; Dir: string; Interf: string; Password: string; FullName: string; UserRight: string; end; PUserDetail= ^TUserDetail; TUsersDetailList=Class(TList) private function Get(Index: Integer): PUserDetail; procedure Put(Index: Integer; Item: PUserDetail); public property Items[Index: Integer]: PUserDetail read Get write Put; default; end; TUsrWork=Class private FFileName: string; FUsersDetailList: TUsersDetailList; FTempFileName: string; FBaseName: string; FUsersNames: TStringList; function GetFileName: string; procedure SetFileName(const Value: string); function CheckFileExists: boolean; function GetUsersDetails: TUsersDetailList; procedure SetUsersDetail(const Value: TUsersDetailList); function GetBaseName: string; procedure SetBaseName(const Value: string); procedure CopyFileToTempDir; Procedure ProcessUsersInfo; Procedure ProcessUsersNames(Root: IStorage); Procedure UpdateUserDetails(Root: IStorage; index: integer); public Constructor Create; Destructor Destroy; override; property FileName: string Read GetFileName Write SetFileName; Property BaseName: string Read GetBaseName Write SetBaseName; property UsersDetailList: TUsersDetailList read GetUsersDetails write SetUsersDetail; function GetUsersNames: TStringList; end; implementation { TUsrWork } function TUsrWork.CheckFileExists: boolean; begin result := False; if FileExists(FFileName) then result := FileIsCompoundDoc(FFileName); end; procedure TUsrWork.CopyFileToTempDir; var SrcFile, copyFile: TFileStream; begin SrcFile:=TFileStream.Create(FFileName, fmOpenRead or fmShareDenyWrite); FTempFileName:=GetTempDirPath+'\usr'+StringReplace(BaseName, chr(34), '', [rfReplaceAll]); CopyFile:= TFileStream.Create(FTempFileName, fmCreate or fmShareExclusive); CopyFile.CopyFrom(SrcFile, SrcFile.Size); SrcFile.Free; CopyFile.Free; end; constructor TUsrWork.Create; begin FUsersDetailList:=TUsersDetailList.Create; FUsersNames:= TStringList.Create; end; destructor TUsrWork.Destroy; begin if Assigned(FUsersDetailList) then with FUsersDetailList do begin Clear; Free; end; if Assigned(FUsersNames) then with FUsersNames do begin Clear; Free; end; inherited; end; function TUsrWork.GetBaseName: string; begin Result:=FBaseName; end; function TUsrWork.GetFileName: string; begin Result:=FFileName; end; function TUsrWork.GetUsersDetails: TUsersDetailList; begin Result:=FUsersDetailList; end; function TUsrWork.GetUsersNames: TStringList; begin Result:=TStringList.Create; Result.AddStrings(FUsersNames); end; procedure TUsrWork.ProcessUsersInfo; var Hr: HResult; Root: IStorage; I: integer; begin Hr := StgOpenStorage(StringToPWideChar(FTempFileName), nil, STGM_READ or STGM_DIRECT or STGM_SHARE_EXCLUSIVE, nil, 0, Root); try OLECheck(Hr); //необходимо открыть поток с содержимым контейнера ProcessUsersNames(Root); //считываем имена пользователей и названия их страниц for i := 0 to FUsersDetailList.Count - 1 do UpdateUserDetails(Root, i); finally Root.Commit(STGC_DEFAULT); end; end; procedure TUsrWork.SetBaseName(const Value: string); begin FBaseName:=Value; end; procedure TUsrWork.SetFileName(const Value: string); begin FFileName:=Value; if Not(CheckFileExists) then Exit; CopyFileToTempDir; FUsersDetailList.Clear; FUsersNames.Clear; ProcessUsersInfo; end; procedure TUsrWork.SetUsersDetail(const Value: TUsersDetailList); begin if Assigned(FUsersDetailList) then FUsersDetailList.Clear; FUsersDetailList:=Value; end; procedure TUsrWork.UpdateUserDetails(Root: IStorage; index: integer); //считываем информацию о пользователе с заданным индексом //********************************************************* //считываем указанное кол-во символов и сдвигаем указатель //********************************************************* function GetSubstr(var L: PChar; Cnt: integer): string; var I: integer; begin Result := ''; if cnt = 0 then exit; for I := 0 to cnt - 1 do begin Result := Result + L^; Inc(L); end; end; var UsersData, P: PChar; WorkStream: IStream; Hr: HResult; Size, NewPos, BytesRead: Largeint; BufferSize: Integer; StatStg: TStatStg; Cnt: byte; DetailItem: PUserDetail; begin DetailItem:=PUserDetail(FUsersDetailList.Items[index]); with DetailItem^ do begin Dir := ''; Interf := ''; Password := ''; FullName := ''; UserRight := ''; end; HR := Root.OpenStream(StringToPWideChar(DetailItem^.PageName), 0, STGM_READ or STGM_DIRECT or STGM_SHARE_EXCLUSIVE, 0, WorkStream); OLECheck(Hr); NewPos := 0; WorkStream.Stat(StatStg, 0); Size := Floor(StatStg.CbSize); BufferSize := Size; GetMem(UsersData, BufferSize); WorkStream.Seek(0, STREAM_SEEK_SET, NewPos); WorkStream.Read(UsersData, BufferSize, @BytesRead); //обрабатываем буфер потока p := UsersData; p := StrPos(p, #01#00#00#00#01#0); if p <> nil then begin Inc(p, 8); //добрались до длины пароля cnt := Byte(Pointer(P)^); Inc(p); DetailItem^.Password := GetSubstr(p, Cnt); //теперь указатель находится на длине полного имени cnt := Byte(Pointer(P)^); Inc(p); DetailItem^.FullName := Trim(GetSubstr(p, Cnt)); //определяем длину каталога cnt := Byte(Pointer(P)^); Inc(p); DetailItem^.Dir := Trim(GetSubstr(p, Cnt)); //передвигаемся к названию интерфейса Inc(p, 4); //определяем длину названия интерфейса cnt := Byte(Pointer(P)^); Inc(p); DetailItem^.Interf := Trim(GetSubstr(p, Cnt)); //определяем длину названия набора прав cnt := Byte(Pointer(P)^); Inc(p); DetailItem^.UserRight := Trim(GetSubstr(p, Cnt)); end; FreeMem(UsersData, BufferSize); end; { TUsersDetailList } function TUsersDetailList.Get(Index: Integer): PUserDetail; begin Result:=inherited get(Index); end; procedure TUsersDetailList.Put(Index: Integer; Item: PUserDetail); begin Inherited put(index, Item); end; //***************************************************************************** //Возвращаем список имен пользователей из Container.Contents Root //***************************************************************************** procedure TUsrWork.ProcessUsersNames(Root: IStorage); var UsersData, P: PChar; WorkStream: IStream; Hr: HResult; Size, NewPos, BytesRead: Largeint; BufferSize: Integer; StatStg: TStatStg; Temp: string; NewDetail: PUserDetail; begin FUsersNames.Clear; FUsersDetailList.Clear; HR := Root.OpenStream(StringToPWideChar('Container.Contents'), 0, STGM_READ or STGM_DIRECT or STGM_SHARE_EXCLUSIVE, 0, WorkStream); OLECheck(Hr); NewPos := 0; WorkStream.Stat(StatStg, 0); Size := Floor(StatStg.CbSize); BufferSize := Size; GetMem(UsersData, BufferSize); WorkStream.Seek(0, STREAM_SEEK_SET, NewPos); WorkStream.Read(UsersData, BufferSize, @BytesRead); //обрабатываем буфер потока P := usersData; while p <> nil do begin p := StrPos(p, '"UserItemType",'#0); if p = nil then break; Inc(p, 16); //добрались до названия потока, содержащего //информацию по пользователю temp := ''; while p^ <> '"' do begin Temp := Temp + p^; inc(p); end; New(NewDetail); NewDetail^.PageName := Temp; //теперь пропускаем запятую и следующую кавычку Inc(p, 3); temp := ''; while p^ <> '"' do begin Temp := Temp + p^; inc(p); end; NewDetail^.UserName := Temp; FUsersNames.Add(Temp); FUSersDetailList.Add(NewDetail) end; FreeMem(UsersData, BufferSize); end; end. |
|||
|
15
Press
15.10.04
✎
14:36
|
(12) Объясняю. Доходчиво. Всего лишь во второй раз. Обработка, позволяет, отображать внешние отчеты с иерархией, хочется добавить кнопку доступ, встаешь
на нужный отчет (группу), нажимаешь ее появляется список пользователей, помечаешь галочками тех кому можно использовать этот отчет (группу) и радуешься. (13) Ну так скажи, что мешает? PS. Только про links.tmp не рассказывай. |
|||
|
16
Press
15.10.04
✎
14:37
|
(14) Средствами 1С, без использования ВК нужно.
|
|||
|
17
MMF
15.10.04
✎
14:39
|
(16) На проклабе есть где-то чтение списка пользователей средствами 1С, но это только имена, без остальной инфы.
|
|||
|
18
Press
15.10.04
✎
14:43
|
(17) Я нашел там одну вещь, как раз то что я сейчас и делаю, но она только для членов.
|
|||
|
19
Последний Будда
15.10.04
✎
14:45
|
18. Мы бы тебе скинули, если бы были уверены, что это тебе действительно нужно.
|
|||
|
20
Press
15.10.04
✎
14:46
|
(19) Могу выслать то что наваял, а там уже решите.
|
|||
|
21
Последний Будда
15.10.04
✎
15:16
|
20 icq 273377239
|
|||
|
22
Press
15.10.04
✎
15:20
|
(21) Аси по рукой нет, давай по мылу.
|
|||
|
23
Последний Будда
15.10.04
✎
15:22
|
matreya@souzp.aaanet.ru
|
|||
|
24
MMF
15.10.04
✎
15:30
|
(19) не подумайте, что это продолжение... просто интересно, почему вы говорите о себе во множественном числе? "Мы бы тебе скинули, если бы были уверены..." Вы - симбиоз организмов, наподобие клубеньковых бактерий и гороха? Или - "Мы, Николай II..."
|
|||
|
25
Последний Будда
15.10.04
✎
15:39
|
24. Мы - потому что от имени нескольких наших лиц.
|
|||
|
26
Press
15.10.04
✎
15:40
|
(25) Я выслал, жду вердикта.
|
|||
|
27
MMF
15.10.04
✎
15:40
|
(25) Простите, о шизофрении, как о вероятной причине такого обращения, я не подумал
|
|||
|
28
Последний Будда
15.10.04
✎
15:46
|
27. :) Человек не может смотреть иначе, чем как через призму своего ума.
|
|||
|
29
Последний Будда
15.10.04
✎
15:53
|
26. Ответил, в том числе и на твои мысли.
|
|||
|
30
Press
15.10.04
✎
16:26
|
(29) Премного благодарен.
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |