Windowsドメイン内のユーザーのコンピューターの便利な検索

みなさんこんにちは!

私は会社で働いています。 1500人以上のアクティブユーザー。

HelpDeskは組織化され、従業員はシステムにチケットを登録しますが、どういうわけか一部のユーザーは背後にあるPCの名前を示すのを忘れていることがわかります。



この情報を(電話/電子メール/超感覚能力で)見つけるために、サポートガールは新鮮なコーヒーや新しいドレス(冗談)について話すために貴重な時間を費やします。 私たちの従業員は、直接の仕事で常に忙しいです。



アイデアは(もちろん革新ではありませんが)ユーザーログオンに関するデータを1つのデータベースに書き込み、Web経由で必要な情報をすばやく検索することです。



画像



何がありますか?



Windows環境(XP / 7/2003/2008)、アカウントはADに保存され、MSSQL 2005 / 2008R2を使用するDBMSとしてすべてのデバイスがローカルネットワークで動作します。



何が欲しい?



Webインターフェイスを介した情報検索:



  1. 従業員が「 Ivanov 」などの姓でログインした場所。
  2. デバイスにログインした人(例:「 PC34 」;
  3. アカウントでログオンが行われた場所(「 hr.ivanov 」など)。




情報が表示されるはずです:







名前?



「ソリューション」は数人(5〜35人)で使用されるため、便宜上、何らかの方法で呼び出す必要があります。 彼を「SuperVisor」と呼びました。



さあ始めましょう



データベースにどのように書き込みますか?



最初に思いついたのは、sqlcmdを使用してbatファイルを作成することでしたが、Windowsの各バージョンには独自のバージョンのsqlcmdユーティリティが必要です。 不便なことに、さらに深く掘り下げることはしませんでした。



2番目の解決策は、小さなexeクライアントを作成し、起動時にドメインアカウント名、PC名、PC IPアドレスに関するデータを収集し、この情報を受け取った後にデータがデータベースに挿入されるようにすることでした。 たとえば、プログラムをドメインコントローラーのNETLOGONフォルダーに配置し、会社のローカルネットワークのPC /サーバーにグループポリシーを配布します。



Delphiのプログラム
unit Unit1; interface uses Windows,SysUtils, Variants, Classes, Forms,WinSock, Dialogs, DB, ADODB,StdCtrls,Messages, ExtCtrls; type TForm1 = class(TForm) boston: TADOConnection; qryinsert: TADOQuery; timer: TTimer; procedure FormCreate(Sender: TObject); procedure timerTimer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} //  0.0.4 //  27-02-2014 function GetCurrentUserName: string; const cnMaxUserNameLen = 254; var sUserName: string; dwUserNameLen: DWORD; begin dwUserNameLen := cnMaxUserNameLen - 1; SetLength(sUserName, cnMaxUserNameLen); GetUserName(PChar(sUserName), dwUserNameLen); SetLength(sUserName, dwUserNameLen); Result := string(sUserName); end; function GetCurrentComputerName: string; const cnMaxComputerNameLen = 254; var sComputerName: string; dwComputerNameLen: DWORD; begin dwComputerNameLen := cnMaxComputerNameLen - 1; SetLength(sComputerName, cnMaxComputerNameLen); GetComputerName(PChar(sComputerName), dwComputerNameLen); SetLength(sComputerName, dwComputerNameLen); Result := string(sComputerName); end; function GetLocalIP: String; const WSVer = $101; var wsaData: TWSAData; P: PHostEnt; Buf: array [0..127] of Char; begin Result := ''; if WSAStartup(WSVer, wsaData) = 0 then begin if GetHostName(@Buf, 128) = 0 then begin P := GetHostByName(@Buf); if P <> nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^); end; WSACleanup; end; end; procedure TForm1.FormCreate(Sender: TObject); begin try qryinsert.SQL.Text := 'begin TRANSACTION insertdata' +#13#10 + 'insert into [supervisor].[user].[info_host](host,login,last_ip) values (:host,:login,:ip)'+#13#10 + 'COMMIT TRANSACTION insertdata'; qryinsert.Parameters.ParamByname('login').Value:= GetCurrentUserName ; qryinsert.Parameters.ParamByname('host').Value:= GetCurrentComputerName ; qryinsert.Parameters.ParamByname('ip').Value:= GetLocalIP ; qryinsert.ExecSQL; timer.Enabled:=True; form1.timer.Interval:=1500; except Application.Terminate; end end; procedure TForm1.timerTimer(Sender: TObject); begin ExitProcess(0); end; end.
      
      









アルゴリズムは次のとおりです。



  1. ユーザーはPCにログインします。
  2. SuperVisor.exeをひそかに開始しました。
  3. 指定されたデータベースに対してINSERTが試行され、成功するとプログラムは作業を終了します。
  4. INSERTが失敗する(ラップトップがローカルネットワーク上にない、データベースサーバーが利用できないなど)場合、タイムアウトは15秒であり、怖いメッセージやウィンドウでユーザーを怖がらせることなくプロセスは「強制終了」されます。




OK、データを保存するテーブルを作成します
 /*  ,     ----------------------------------------------------------- host -   login -     last_ip - ip   createdate -    createdate_unix - unix ,    ------------------------------------------------------------ */ CREATE TABLE [user].[info_host]( [id] [int] IDENTITY(1,1) NOT NULL, [host] [nvarchar](128) NULL, [login] [nvarchar](128) NULL, [createdate] [datetime] NOT NULL, [createdate_unix] [int] NOT NULL, [last_ip] [nvarchar](20) NULL ) ON [supervisor] GO ALTER TABLE [user].[info_host] ADD DEFAULT (getdate()) FOR [createdate] GO ALTER TABLE [user].[info_host] ADD DEFAULT (datediff(second,'1970-01-01 00:00:00',getutcdate())) FOR [createdate_unix]
      
      







 /*      ,   .       ------------------------------------------------------------ login -     displayName -  displayname      createdate -    createdate_unix - unix ,    ------------------------------------------------------------ */ CREATE TABLE [user].[info_login_card]( [id] [int] IDENTITY(1,1) NOT NULL, [login] [nvarchar](128) NULL, [createdate] [datetime] NOT NULL, [createdate_unix] [int] NOT NULL, [displayName] [nvarchar](256) NULL ) ON [supervisor] GO ALTER TABLE [user].[info_login_card] ADD DEFAULT (getdate()) FOR [createdate] GO ALTER TABLE [user].[info_login_card] ADD DEFAULT (datediff(second,'1970-01-01 00:00:00',getutcdate())) FOR [createdate_unix] GO
      
      









テーブルが作成され、データが入力されます。 データベースサーバーは仮想であり、Windows Server 2003R2、DBMS MSSQL 2008R2で動作することを書くのを忘れていました。 仮想アプリケーションサーバー、Windows 2003R2、Apache 2.2 + PHP 5.2



次のステップは、システム管理者とヘルプデスクのスタッフが快適にサービスを操作できるようにWebインターフェースを作成することです。 内部開発では、時間を節約するために、Bootstrapフレームワークを使用します。 検索バーにデータを入力する前のメインページは次のようになります。



画像



検索バーでは、従業員/アカウントの名前(ログイン)またはコンピューター名を入力できます。



画像



さらに、従業員のフルネーム/ユーザー名/ PC名を入力する必要はありません、データベース内の一致の検索はLIKE演算子を使用して実行され(例... LIKE 'willow%')、クエリは非同期に実行され、検索結果は従業員の目の前でページをリロードせずに更新されます検索バーに新しい文字を入力した後。



データベースを照会して名前で検索する
  set rowcount $limit SELECT a.[id] ,a.[host] ,a.[login] ,a.[createdate] ,a.[createdate_unix] ,a.[last_ip] ,b.[displayName] FROM [user].[info_host] a left join [user].[info_login_card] b on a.login = b.login where b.displayName like ('$ihostlogin') order by a.[createdate_unix] desc set rowcount 0
      
      









PC名で検索するdbへのクエリ
  set rowcount $limit SELECT a.[id] ,a.[host] ,a.[login] ,a.[createdate] ,a.[createdate_unix] ,a.[last_ip] ,b.[displayName] FROM [user].[info_host] a left join [user].[info_login_card] b on a.login = b.login where a.host like ('$hostlogin') order by a.[createdate_unix] desc set rowcount 0
      
      









ログイン検索
 set rowcount $limit SELECT a.[id] ,a.[host] ,a.[login] ,a.[createdate] ,a.[createdate_unix] ,a.[last_ip] ,b.[displayName] FROM [user].[info_host] a left join [user].[info_login_card] b on a.login = b.login where a.login like ('$hostlogin') order by a.[createdate_unix] desc set rowcount 0
      
      









「スーパーバイザー」は約1年間、当社の主なタスクに完全に対処してきました。 チケットはより迅速に機能するようになりました。従業員は、アプリケーションの決定に違反するために追加情報を明確にするために時間を費やす必要がありません。



私の意見では、コンピューターの名前を決定するというこの決定は、現代的で便利であることが判明しました。



頑張ってください!



便利なリンク



Apache2.2およびPHP-5をインストールします

MS SQLをPHP 5.3以降に接続します



All Articles