ここ最近、UiPathでイロイロ遊んでます。そこでUiPath (ja) Advent Calendar 2018に参加してみました。第二弾!
結論!
セキュリティー担保したいなら、Orchestrator買え。以上。
はじめに
UiPathを軽くみんなでお安く使用しようとすると、Node-Lockedライセンスという共有端末をみんなで使うライセンス形態があります。しかし!、この場合、どのユーザーでログインしても、端末に入っているすべてのロボットが見えてしまいます。つまり申請系と承認系のロボットが起動できてしまうという、監査人大喜びのツッコミどころができてしまいます。
そこで、ユーザーがActive DirectoryなりWindows OSのセキュリティーグループに所属しているかを確認するプログラムを作ってみます。
Active Directoryでは、グループの中にグループを突っ込めたりするので、単にグループのメンバーの一覧取得だと、ガッつり再帰かけないといけないので面倒すぎます。この時IADsGroupクラスのIsMember を使うのがいつものパターンです。
ではやってみる。
↑OrchestratorなしのNode Lockedライセンスだと、すべてのロボットがどのユーザーにログインしても見えて実行が可能
Orchestratorなしで頑張ってみる
まずは、参照の追加。DirectoryEntryは System.DirectoryServicesの参照を追加して…あれ?IADsGroupはCOMだけどどうやって参照するんだ?
XAMLで追加するのはあくまでclr-namespaceなので、きっぱりあきらめる。
ここで登場するのは、「カスタムアクティビティ」
自分でもサクっとアクティビティを作れてしまうのがUiPathのいいところ。だって、まんまWFなんだもの。
■作業
1、プログラムを作成
2、パッケージを作成
3、UiPathに読込
4、使ってみる
1、プログラムを作成
新しい.クラスライブラリ(NET Framework)のプロジェクトを作って次の4つを参照追加
.NET
・System.Activities
・System.ComponentModel.Composition
・System.DirectoryServices
COM
・Active DS Type Library
(コードは最後に入れてます)
2、パッケージを作成
詳しい作成方法は、「カスタムアクティビティ」をごらんあれ
3、UiPathに読込
「パッケージを管理」から設定を押して、作成したパッケージの場所を追加してください。詳しくは(以下略
Activitiesペインに表示されるようになります
4、使ってみる
ローカルコンピューターのAdministratorsグループにいるかを確認
TargetGroup:”Administrators”
TargetService:System.Environment.MachineName
成功!!!
こんなもん作ってメンテナンスするくらいなら、Orchestrator買いましょう^^;
以下、コード
Imports System.Activities
Imports System.ComponentModel
Imports System.DirectoryServices
Imports ActiveDs
Public Class IsGroupMember
Inherits CodeActivity
<Description("Domain | Domain\ComputerName | ComputerName")>
<Category("Input")>
<RequiredArgument>
Public Property TargetService As InArgument(Of String)
<Description("対象のグループ名")>
<Category("Input")>
<RequiredArgument>
Public Property TargetGroupName As InArgument(Of String)
<Description("結果")>
<Category("Output")>
<RequiredArgument>
Public Property Result As OutArgument(Of Boolean)
Protected Overrides Sub Execute(context As CodeActivityContext)
Dim comInfo As DirectoryEntry = New DirectoryEntry("WinNT://" + TargetService.Get(context))
Dim theGroup As DirectoryEntry = comInfo.Children.Find(TargetGroupName.Get(context), "group")
Dim localgroup As IADsGroup = CType(theGroup.NativeObject, IADsGroup)
Dim currentUser As String = "WinNT://" + System.Environment.UserDomainName + "/" + System.Environment.UserName
Result.Set(context, localgroup.IsMember(currentUser))
End Sub
End Class