2009年12月16日水曜日

すべてのアプリケーションのACLエントリを書き出す

あるサーバー内に設置されたすべてのアプリケーションでアクセス権がどのように設定されているのか、ということを一気に書き出すエージェント(Lotus Script)を紹介します。

ACL取得専用のDBをひとつサーバーに設置して、エージェントを二つ登録します。

ひとつは、下に示すエージェントをサーバー上で実行する指示を出すエージェント、

もうひとつは、以下のとおりです。

処理のおおまかな流れとしては、

1. サーバー内のアプリケーションのリストを取得する
2. 各アプリケーションのACLエントリを書き出す

となっています。

サーバー内のアプリケーションのリストは、NotesSession.GetDbDirectory で取得できます。
リストからアプリケーションを1件取り出してはACLのエントリを書き出す、という処理を繰り返すわけです。

ひとつのACLエントリにつき1文書を書き出していきます。
Sub Initialize
    '処理を起動する
    Dim ss As New NotesSession
    Call dblist(ss)
End Sub

Sub dblist(ss as NotesSession)
    'サーバー上にあるアプリケーションのリストを取得、処理させる
    Dim dbdir As NotesDbDirectory
    Dim db As NotesDatabase
    Set dbdir = ss.GetDbDirectory(ss.CurrentDatabase.Server)
    Set db = dbdir.GetFirstDatabase(DATABASE)
    While Not (db Is Nothing)
        Call getaclentries(db, ss)
        Set db = dbdir.GetNextDatabase()
    Wend
End Sub

Sub getaclentries(db As NotesDatabase, ss as NotesSession)
    'アプリケーションのACLに登録されたエントリを書き出します。
    Dim notesacl As NotesACL
    Dim aclentry As NotesACLEntry
    Dim doc As NotesDocument

    If Not db.IsOpen Then flag = db.Open("", "")
    Set notesacl = db.ACL
    Set aclentry = notesacl.GetFirstEntry()
    While Not (aclentry Is Nothing)
        Set doc = New NotesDocument(ss.CurrentDatabase)
        With doc
            .Form = "ACLEntry"
            .Server = db.Server
            .DBFilePath = db.FilePath
            .DBTitle = db.Title
            .DBReplicaID = db.ReplicaID
            .CreateDate = CreateDate.LSLocalTime
            .CanCreateDocuments = OFFON(aclentry.CanCreateDocuments)
            .CanCreateLSOrJavaAgent = OFFON(aclentry.CanCreateLSOrJavaAgent)
            .CanCreatePersonalAgent = OFFON(aclentry.CanCreatePersonalAgent)
            .CanCreatePersonalFolder = OFFON(aclentry.CanCreatePersonalFolder)
            .CanCreateSharedFolder = OFFON(aclentry.CanCreateSharedFolder)
            .CanDeleteDocuments = OFFON(aclentry.CanDeleteDocuments)
            .CanReplicateOrCopyDocuments = OFFON(aclentry.CanReplicateOrCopyDocuments)
            .IsAdminReaderAuthor = OFFON(aclentry.IsAdminReaderAuthor)
            .IsAdminServer = OFFON(aclentry.IsAdminServer)
            .IsGroup = OFFON(aclentry.IsGroup)
            .IsPerson = OFFON(aclentry.IsPerson)
            .IsPublicReader = OFFON(aclentry.IsPublicReader)
            .IsPublicWriter = OFFON(aclentry.IsPublicWriter)
            .IsServer = OFFON(aclentry.IsServer)
            .Level = aclentry.Level
            .Name = aclentry.Name
            .Roles = aclentry.Roles
            .UserType = aclentry.UserType
            flag = .Save(True, True)
        End With
        Set aclentry = notesacl.GetNextEntry(aclentry)
        Set doc = Nothing
    Wend
End Sub

Function OFFON(flag As Variant) As String
    'True/Falseの値を扱いやすくするため、Trueを"1"、Falseを"0"に置き換えます
    If flag Then
        OFFON = "1"
    Else
        OFFON = "0"
    End If
End Function

ところで、サーバー管理者と言えど全てのアプリケーションへのアクセスが許可されていない場合があります。
そこで、NotesAgent.RunOnServer でエージェントをサーバー側で実行する際、サーバー側で実行するエージェントのプロパティにある「実行時セキュリティレベルの設定」は"3. フルアドミニストレータ権限で制限された操作を許可する"を選択します。


当方では、上記で書き出したリストを簡易な変更履歴として保管する仕組みを追加しています。といっても、前回までに取得したACLエントリ文書へフラグをたてて、最新のACLエントリ文書と区別できるようにしているだけですけどね。

0 件のコメント:

コメントを投稿