Имя: Пароль:
1C
 
Как получить список работающих пользователей?
0 Символ
 
14.10.04
14:49
Как в 7.7 для SQL получить список работающих в данный момент пользователей (тех, что в мониторе пользователей)?
1 Crew
 
14.10.04
15:13
(0)
Смотри в папках пользователей наличие 1cv7.lck

может есть другой способ, но я не знаю.
2 Символ
 
14.10.04
15:32
(1) И как я зная папку с файлом 1cv7.lck определю ИмяПользователя?
3 Rovan
 
гуру
14.10.04
15:35
Если тупо можно в справочнике Пользователи флажок ставить работает/не работает.
Но если система повисла/упала будет неправда.
4 Crew
 
14.10.04
15:37
(2) 2-а варианта
1) заранее прописать в модуле соответствие каталога пользователю
2) отпарсить файл users.usr
5 Волшебник
 
14.10.04
15:39
6 Как все запущено
 
14.10.04
16:09
Если типа Волшебник дает такие галимые ссылки как в (5) на детский вопрос.
7 Волшебник
 
14.10.04
16:12
(6) Какие ссылки есть, такие и даю. Если там нет какой-то информации и вам это не понравилось, то вы можете расписать все правильно. Но так как вы этого не сделали, то и нечего причитать...
8 Albert
 
14.10.04
16:16
В мониторе
9 Как все запущено
 
14.10.04
16:20
(7) Понял. Расписываю известную всем истину, которая по непонятным причинам неизвестна магу и волшебнику 1С-а.
Список активных пользователей содержится в файле syslog\links.tmp. Для определения активности записи используется залочивание (LockFile) одного байта в этом файле со смещением 2000001+ номер записи.
10 Символ
 
14.10.04
16:33
(7) А ведь в (9) правда. Я это сам раскопал, чуть раньше чем был написан этот ответ, но тем не менее. Непонятно, почему Волшебник не рекомендует этот ответ в базу знаний. А в (5) ссылка - пустышка
11 Волшебник
 
14.10.04
18:44
(9) Очень рад получить для себя новую информацию. Спасибо!
12 белый и пушистый MMF
 
14.10.04
19:29
(11) Рискую быть заплеваным за очевидные недостатки нижеприведенного модуля (но "работает - не трожь). Возможно, пригодится кому-нибудь.

метод ВК, возвращающий таблицу значений с информацией о подключениях
Function TAddInObject.GetLinks(): OleVariant;
var
 Obj1C: OleVariant;
 LinksWork: TLinksWork;
 i: integer;
begin
 Obj1C:= OleVariant(pCon).AppDispatch;
 IDispatch(obj1C)._AddRef;
 Result:=Obj1C.CreateObject('ТаблицаЗначений');
 Result.NewColumn('Имя', 'Строка');
 Result.NewColumn('Режим', 'Строка');
 Result.NewColumn('Компьютер', 'Строка');
 Result.NewColumn('ВремяВхода', 'Строка');
 try
   LinksWork:=TLinksWork.Create;
   if LinksWork.CheckLinks(Obj1C.IBDir+'\Syslog\Links.tmp') then
     for i:=0 to LinksWork.Count-1 do
     begin
       Result.NewLine;
       Result.Имя:= LinksWork.Links[i]^.usrName;
       Result.Режим:= LinksWork.Links[i]^.usrMode;
       Result.Компьютер:= LinksWork.Links[i]^.usrComp;
       Result.ВремяВхода:= LinksWork.Links[i]^.usrTime;
     end;
 finally
   if Assigned(LinksWork) then LinksWork.Free;
 End;
end;

вспомогательный модуль

unit LinksWork;

interface
uses Windows, SysUtils, Classes;

type
 //элемент - подключение пользователя
 TLinkInfo = record
   usrName: string;
   usrMode: char;
   usrTime: string;
   usrComp: string;
 end;
 PLinkInfo=^TLinkInfo;

 TLinksList=Class(TList)
 end;

 TLinksWork=class
 protected
   function Get(Index: Integer): PLinkInfo;
 private
   FFileName: string;    
   FFileHandle: THandle;  
   FMapHandle: THandle;  
   FFileOpened: Boolean;  
   FLinks: TLinksList;    
   FDataSize: Integer;    
   PData: PByte;          
   function GetFileIsOpened: Boolean;
   function GetLinksCnt: integer;
   Function OpenFile(): boolean;
   Procedure CloseFile();
   function CreateFileMap: Boolean;
   Function TestRecordAlive(RecNum: integer): boolean;
 public
   Constructor Create;
   Destructor Destroy; override;
   procedure Clear;
   property Count: Integer read GetLinksCnt;
   property FileIsOpened: Boolean read GetFileIsOpened;
   property Links[Index: Integer]: PLinkInfo read Get; default;
   function CheckLinks(FileName: string): boolean;
 end;

implementation

{ TLinksWork }

//*****************************************************************************
//определим, является ли запись живой, для этого
//попытаемся залочить байт по адресу 2000001+ номер записи
//*****************************************************************************
function TLinksWork.TestRecordAlive(RecNum: integer): boolean;
var LockAddr: integer;
begin
 if not (FFileOpened) then
 begin
   Result := False;
   Exit;
 end;
 LockAddr:=$1E8481 + RecNum - 1;
 Result := True;
 if not (LockFile(FFileHandle, LockAddr, 0, 1, 0)) then Exit;
 Result := False;
 UnLockFile(FFileHandle, LockAddr, 0, 1, 0);
end;

function TLinksWork.CheckLinks(FileName: string): boolean;
var
 usrName, usrTime, usrComp: string;
 Cur, UsrMode: char;
 PTempData: Pchar;
 RecNum, DataSize: integer;
 Item: PLinkInfo;
 strWin: string[8];

 procedure AppendChar(c: Char);
 var i: byte;
 begin
   for i := 1 to 7 do strWin[i] := strWin[i + 1];
   strWin[8] := c;
 end;
 procedure StepOut();
 begin
   inc(PTempData);
   Dec(DataSize);
 end;
 function GetSubstr():string ;
 begin
   Result:='';
   repeat
     StepOut;
     Result := Result + PTempData^;
   until (PTempData^ = '"') or (DataSize = 0);
 end;

begin
 FFileName:=FileName;
 Result:=false;
 Clear;
 if FFileOpened then CloseFile;
 if Not(OpenFile) then Exit;
 if not (CreateFileMap()) then Exit;

 PTempData := PChar(PData);
 strWin := '12345678';
 RecNum := 0;
 DataSize:=FDataSize;
 while DataSize > 0 do
 begin
   cur := PTempData^;
   //ищем строку "Name","
   AppendChar(Cur);
   if StrWin = '"Name","' then
   begin
     UsrName:='';
     usrMode := '?';
     usrTime := '';
     usrComp := '';
     usrName:=GetSubstr;
     usrName := Copy(UsrName, 1, Length(usrName) - 1); //удалили правую кавычку
     Inc(RecNum);
     //ищем режим запуска
     //' mode","'
     strWin := '12345678';
     while DataSize > 0 do
     begin
       //ищем строку ' mode","'
       cur := PTempData^;
       AppendChar(Cur);
       if StrWin = ' mode","' then
       begin
         //считываем букву режима
         AppendChar(Cur);
         StepOut;
         Cur := PTempData^;
         case Cur of
           'E': UsrMode := 'П';
           'C': UsrMode := 'К';
           'M': UsrMode := 'М';
           'D': UsrMode := 'О';
         end;
         Break;
       end;
       StepOut;
     end;

     //определяем время входа
     //&Time","
     strWin := '12345678';
     while DataSize > 0 do
     begin
       //ищем строку '&Time","'
       cur := PTempData^;
       AppendChar(Cur);
       if StrWin = '&Time","' then
       begin
         UsrTime:=GetSubstr();
         break;
       end;
       StepOut;
     end;

     strWin := '12345678';
     while DataSize > 0 do
     begin
       //ищем строку 'rName","'
       cur := PTempData^;
       AppendChar(Cur);
       if StrWin = 'rName","' then
       begin
         UsrComp := GetSubstr;
         break;
       end;
       StepOut;
     end;

     //добавляем считанную информацию
     if TestRecordAlive(RecNum) then
       begin
         UsrComp := Copy(UsrComp, 1, Length(usrComp) - 1);
         UsrTime := Copy(UsrTime, 1, Length(usrTime) - 1);
         New(Item);
         Item^.usrName:=UsrName;
         Item^.usrMode:=UsrMode;
         Item^.usrTime:=UsrTime;
         Item^.usrComp:=UsrComp;
         FLinks.Add(Item);
       end;
     strWin := '12345678';
   end;
   StepOut;
 end;
 CloseFile;
 Result:=True;
end;

procedure TLinksWork.Clear;
begin
 FLinks.Clear;
end;

procedure TLinksWork.CloseFile;
begin
 if FFileOpened then
 begin
   CloseHandle(FFileHandle);
   CloseHandle(FMapHandle);
   UnmapViewOfFile(PData);
   FFileOpened:=false;
 end;
 PData:=Nil;
 FFileHandle:=0;
 FMapHandle:=0;
end;

function TLinksWork.CreateFileMap: Boolean;
begin
 result := False;
 FDataSize := GetFileSize(FFileHandle, nil);
 FMapHandle := CreateFileMapping(FFileHandle, nil, PAGE_READWRITE, 0, FDataSize,
   nil);
 if FMapHandle = 0 then Exit;
 PData := MapViewOfFile(FMapHandle, FILE_MAP_ALL_ACCESS, 0, 0, FDataSize);
 if PData = nil then Exit;
 Result := True;
end;

destructor TLinksWork.Destroy;
begin
 Clear;
 CloseFile;
 if Assigned(FLinks) then FreeAndNil(FLinks);
 inherited;
end;

function TLinksWork.Get(Index: Integer): PLinkInfo;
begin
 Result:=Nil;
 if Index>FLinks.Count then
   begin
     raise Exception.Create('Неверный индекс подключения');
     Exit;
   end;
 Result:=PLinkInfo(FLinks[Index]);
end;

function TLinksWork.GetFileIsOpened: Boolean;
begin
 Result:=FFileOpened;
end;

function TLinksWork.GetLinksCnt: integer;
begin
 Result:=FLinks.Count;
end;

function TLinksWork.OpenFile(): boolean;
begin
 if Not(FileExists(FFileName)) then
   begin
     FFileOpened:=False;
     Result:=False;
     Exit;
   end;
 FFileHandle:=FileOpen(FFileName, fmOpenReadWrite or fmShareDenyNone);
 result := FFileHandle >0;
 FFileOpened:=Result;
end;

constructor TLinksWork.Create;
begin
 inherited;
 FLinks:=TLinksList.Create;
 FFileOpened:=False;
end;
13 GrayT
 
14.10.04
20:41
Э-э-э, а что делать если Дельфи нет на машине?
tswsoft гав tamb.ru - если не влом конечно :)
14 белый и пушистый MMF
 
14.10.04
20:44
15 GrayT
 
14.10.04
20:46
Огромное спасибо
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.