ServiceTimer

PageLastUpdate:2007-08-11/total: - /today: - /yesterday: -

開発日誌(背景緑は済み)

  1. ロック予定時刻取得-2007/07/16
  2. ロック-2007/07/16
  3. ログオフ → ログオフは危険なので当面ロックのみで行く。用は足りる。他に使う人がいたら追加。
  4. ユーザーからの延長申請-2007/07/17
  5. 管理者の承認権限取得-2007/07/17 ついに詰まった。階層化された権限をSQLのみで取得するのが異常に困難。つか、できるのはわかってるけどあまりにも効率が悪すぎる。ちょっとペンディング。→2007/07/18できた!
  6. 承認の更新/修正-2007/07/20
    1. 承認グリッドのコンボ化
    2. 承認グリッドの複数行選択から右クリックして一括変更(あとでもいいかも)
  7. ユーザーの権利再取得
  8. 一括スケジュール登録
  9. コネクション設定
  10. 各マスタ管理
  11. インストーラ
2007/07/16 英語の素養がないので、名前決めで物凄い時間を使う。manageとmanagementをmanageableとmanagingとmanagedでどれを使おうとか。
2007/07/19 仕事で疲れて進まず。せっかく要の権限系は見通し立ったんだから、早いとこ実働させたい・・・
2007/07/21 時間はあるけど、ノれない。完成形が見えて安心したのか、疲れてるのか。とりあえずちょっと放置してみる。
2007/08/10 ドメコン吹き飛んだので再設定で2週間が過ぎるw。そろそろ再開するかな?でも別のツールを開発したくなった。

追加メモ

権限があろうがなかろうがログイン記録は残す。
現在登録されてる時間とぶつかったら? → オーダー(OrderType)に優先度の概念
  1. 上書きしない
  2. 未承認の予定は上書き
  3. すべて上書き

オプション候補

  • 自分を承認可能
  • 警告する時間

追加機能

  1. メッセンジャー/付箋/タスクメモ
  2. スナップショット
  3. ランゲージファイル
  4. ClickOnce

複雑な仕組みをシンプルに見せる

ユーザーのデスクトップの片隅に時計。できればタスクバーか。
終了時刻の30分前になると延長申請の画面でポップアップ。
  • 承認権のあるユーザーを表示
終了時刻になると延長申請の画面でポップアップ&メッセージボックス。
「終了時刻です。5分後にPCがロックされます。」
  • 承認権のあるユーザーを表示
1.ユーザーがシャットダウン→終了
2.延長申請→承認権限のあるユーザーに通知。
承認画面でポップアップ&メッセージボックス。
「XX件の承認申請があります。」
3.放置→ロック。

ロックされているPCは違う色で表示。

※通知はできればIPでやりたいけどとりあえずは10分に1回通知で。

階層化された権限をSQLのみで取得

2007/07/18 て、手ごわかった・・・。
ALTER PROCEDURE dbo.ServiceTimer_ManagementOrders
AS
--ユーザーが承認できるオーダーの一覧を取得するストアド
 
--自分と所属するグループが管理するアカウントオーダーを作成
DECLARE @MyManagedRange TABLE(AccountID INT,OrderType nvarchar(64),PRIMARY KEY(AccountID,OrderType))
 
INSERT INTO @MyManagedRange (AccountID,OrderType)
SELECT T1.ManagedAccountID,T1.OrderType
FROM dbo.ServiceTimer_Management AS T1
INNER JOIN dbo.ServiceTimer_Parents(SUSER_SNAME()) AS T2
ON T1.ManagerAccountID=T2.GroupID
 
WHILE @@ROWCOUNT>0
BEGIN
	INSERT INTO @MyManagedRange (AccountID,OrderType)
	SELECT T4.AccountID,T4.OrderType
	--上位グループで管理対象になったら追加
	FROM (
	--上位グループIDをつけてみる
	SELECT T1.GroupID,T2.AccountID,T2.OrderType
	FROM ServiceTimer_GroupMember AS T1
	INNER JOIN ServiceTimer_Order AS T2
	ON T1.MemberID=T2.AccountID
	--管理対象になっているもの以外に
	LEFT OUTER JOIN @MyManagedRange AS T3
	ON T2.AccountID=T3.AccountID
	AND T2.OrderType=T3.OrderType
	WHERE T2.LogonScheduleDT > GetDate()
	AND T3.AccountID IS NULL
	--キー重複しないように念のためグルーピング
	GROUP BY T1.GroupID,T2.AccountID,T2.OrderType
	) AS T4
	INNER JOIN @MyManagedRange AS T5
	ON T4.GroupID=T5.AccountID
	AND T4.OrderType=T5.OrderType
	--キー重複しないように念のためグルーピング
	GROUP BY T4.AccountID,T4.OrderType
END
 
SELECT *
FROM ServiceTimer_Order AS T1
INNER JOIN @MyManagedRange AS T2
ON T1.AccountID=T2.AccountID
AND T1.OrderType=T2.OrderType
 
RETURN
 

初期メモ

ちょっと自作してみるツールのメモ。まだ構想中で読んでもムダなページです。

  • 各ユーザーのPCへのログイン/ログアウトを記録して集中管理
  • 各ユーザーごとの設定時刻が来ると強制ログオフ
  • 上司(階層は独自管理でもActive Directory準拠でも)が自分のPCから
 ユーザーごとに指定日の強制ログオフ時刻を変更できる。


シャットダウン/ログオフ/ロック

オペレート時刻の記録

誰がいるか アプリが立ち上がっている→サービスとして動作?
 ログインしている

管理アプリがログオフを行わせる→ユーザーとしてログオンする部品
とりあえずは「コンソールユーザー」に対する処理でいい。

ログインユーザの一覧→IPメッセンジャーとおなじじゃん
「誰が」の権限は?

当面ドメイン環境に特化する

データベースを使用。IPモードは後でいいか。
ログオン/ログオフスクリプトと併用?



SYSTEM権限で実行
 データベースにHOSTNAMEとUSERNAMEを記録
 データベースからそのユーザーの「現在有効な終了予定」を取得
 そのユーザーの「現在有効な終了予定」がなければ標準予定を使用

 システム日時が「現在有効な終了予定」の15分前になったら警告開始。
 システム日時が「現在有効な終了予定」を超えたら強制ログオフ

 終了予定を新たに登録したければ上長に申請
 上長が承認すれば新たに「現在有効な終了予定」が登録される。


エラー対応
  • 強制切断
  • ネットワーク使用不能状態でログオフ

ログテーブル
LogID/DomainName/UserName/HostName/LogonDateTime/LogoffDateTime/LockDateTime/LastState
Logon時にLogIDを取得。終了時にLogIDで更新に行く。

WHERE UserName=UserName And HostName=HostName And LogoffDateTime Is Null
5分に一回レジストリに記録
許可テーブル
DomainName/UserName/LogonDateTime/LogoffDateTime

Group
標準予定
UserName
GroupName

営業日の処理をどうする?→禁止日時の設定で対応

まずは「今日+固定時刻」で行こう。カレンダー処理は後で。
問い合わせを関数にしておく。

現在誰がログインしているか、承認者がいるか、の判定はデータベースで「ログオン」していることになっているPCにpingで確定。
本来はデータベースを使わなくてもできるはず。
有効なPCを羅列するような処理を管理人が理解できていないので、できればあとで改善。
トラフィックを抑える意味ではこれでいい気もする。

TODO:
ストアドにLogIDなしでログインしようとしたら同一ホスト同一ユーザーのログオフしてない履歴があったときの処理を書く。

※あとで実装
同一ユーザー同一ホストのログオフされた記録はバックアップテーブルに移行する。
ただでさえログオン/ログオフに処理時間をかけるから、少しでも速くするため。


受信のタイミングをどう取るかがわかんね。ループでまわし続けるのか?

ServiceTimer_Logon

  1. ALTER PROCEDURE dbo.ServiceTimer_Logon
  2. (
  3. @LogID int OUTPUT
  4. )
  5. AS
  6.  
  7. DECLARE @ERR int
  8. DECLARE @RC int
  9.  
  10. --同一端末同一ユーザーでログオフしていない記録があれば現在時刻をログオフ時刻として記録
  11. UPDATE ServiceTimer_LogTable
  12. SET LogoffDateTime=GetDate()
  13. ,LogState='LogoffByOtherLogon'
  14. WHERE ComputerName=HOST_NAME()
  15. AND LoginID=SUSER_SNAME()
  16. AND LogoffDateTime Is Null
  17.  
  18. SELECT @ERR=@@ERROR ,@RC=@@ROWCOUNT
  19.  
  20. --とりあえずログオン
  21. INSERT INTO ServiceTimer_LogTable (LogonDateTime,LogState) SELECT GetDate(),'Logon'
  22.  
  23. --標準的なLogon状態のレコードのみ戻す。
  24. SELECT *
  25. FROM ServiceTimer_LogTable
  26. WHERE LogState='Logon'
  27.  
  28. RETURN
  29.  

ServiceTimer_Logoff

  1. ALTER PROCEDURE dbo.ServiceTimer_Logoff
  2. (
  3. @LogID int,
  4. @State int OUTPUT
  5. )
  6. AS
  7. DECLARE @ERR int
  8. DECLARE @RC int
  9.  
  10. --同一端末同一ユーザーでログオフしていない記録があれば現在時刻をログオフ時刻として記録
  11. UPDATE ServiceTimer_LogTable
  12. SET LogoffDateTime=GetDate()
  13. ,LogState='LogoffByOtherLogoff'
  14. WHERE ComputerName=HOST_NAME()
  15. AND LoginID=SUSER_SNAME()
  16. AND LogoffDateTime Is Null
  17.  
  18. UPDATE ServiceTimer_LogTable
  19. SET LogoffDateTime=GetDate()
  20. WHERE LogID=@LogID
  21. AND LogoffDateTime Is Null
  22. SELECT @ERR=@@ERROR ,@RC=@@ROWCOUNT
  23.  
  24. IF @RC=0
  25. BEGIN
  26. INSERT ServiceTimer_LogTable (LogoffDateTime,LogState) SELECT GetDate(),''
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33. RETURN
  34.  


comment

このページの記述で聞きたいこととか間違ってることとかありましたらコメントを。
  • 思ったより手ごわいなぁ。特にロック周りとか。3連休で仕上げるつもりだったのにダメダメ。 -- (memo77) 2007-07-16 21:49:15
  • 現在の情報はほとんどツールチップで! -- (memo77) 2007-07-21 00:26:30
名前:
コメント:

すべてのコメントを見る

最終更新:2007年08月11日 09:31