スクリプト化されたルール
このセクションの内容
スクリプト化されたルール
スクリプト化されたルールでは、Windows PowerShell または VB Scripts を使用して、カスタム ルールを作成できます。スクリプトの成功または失敗は、ルールの一部であるセキュリティレベル、許可された項目、拒否された項目がユーザに適用されるかどうかを決定します。
スクリプト化されたルールは、COM (Component Object Model) など、PowerShell または VBScript 経由でアクセス可能なインターフェイスであればどれでも利用でき、各スクリプトは次のような状況下で評価されます。
- 新しい構成がコンピュータに配布されたとき。
- ユーザがログオンするとき。
次のようにアクセスできる、[スクリプト化されたルール] ダイアログでスクリプトを作成および編集します。
- [ルール] リボンで、[ルールの追加] を選択します。
-
ドロップダンメニューで、[スクリプト化されたルール] を選択します。
[スクリプト化されたルール] 作業領域が表示されます。
次のスクリプト化されたルール オプションを使用して、スクリプトを実行するタイミングを定義できます。
- ログオン ユーザとしてログオン セッションごとに1回スクリプトを実行する - 各ユーザ ログオンに対してスクリプトを実行します。設定は、ユーザ セッション中にのみ適用されます。デスクトップがロック解除されている場合は、スクリプトも実行されます。
- SYSTEM ユーザとしてログオン セッションごとに1回スクリプトを実行する - 各ユーザ ログオンに対して、SYSTEM アカウント権限で、スクリプトを実行します。設定は、ユーザ セッション中にのみ適用されます。
-
SYSTEM ユーザとしてコンピュータごとに1回スクリプトを実行する - コンピュータの起動時に、SYSTEM アカウント権限で、スクリプトを実行します。設定は、コンピュータが再起動するか、Application Control エージェントが再起動するか、構成変更が発生するまで、すべてのユーザ セッションに適用されます。
注意:SYSTEM ユーザでスクリプトを実行すると、コンピュータに深刻な損害が発生するおそれがあるため、上級スクリプト作成者のみが有効にしてください。
-
ユーザ ログオンが完了するまでスクリプトを実行しない - 選択すると、ユーザ ログオンが完了するまで、スクリプトを実行できません。
-
スクリプトのタイムアウトまで<n>秒間待機する - スクリプトがタイムアウトするまで、スクリプトを続行できる秒数を指定できます。ゼロ (0) 秒を設定すると、スクリプト タイムアウトが無効になります。タイムアウトが発生する場合、結果は失敗であり、設定を適用できません。
VBScripts
各スクリプトはホストされたスクリプト エンジン内で実行され、スクリプト実行の制御度合いが高くなり、入出力の制御もより適切に行えます。
- VBS ファイルは使用されません。
- 別のプロセスは発生しません。
スクリプトは関数として作成する必要があります。多数の関数を使用できますが、メインの開始関数を指定する必要があります。開始関数は、Application Control エージェントによって実行され、他の関数を呼び出すために使用できます。
AMScriptRule COM オブジェクトはスクリプト エンジンに組み込まれ、次のメソッドへのアクセスを提供します。
strUsername = AMScriptRule.UserName
strUserdomain = AMScriptRule.UserDomain
strSessionid = AMScriptRule.SessionID
-
strStationname = AMScriptRule.WinStation
このインスタンスの Microsoft 標準は、WinStation がターミナル サービス セッションの名前の値を返すことを意味します。これは、一般的に WinSta0である Windows ステーション名ではなく、「Console」または「RDP-Tcp#34」という標準値のセッションのタイプによって決定されます。
AMScriptRule COM オブジェクトには次のメソッドも含まれます。
-
strLog = AMScriptRule.Log "My Log Statement"
スクリプト化されたルールのデバッグで使用するために、ログ文字列をエージェント ログ ファイルに出力できます。
-
strEnvironmentvar = AMScriptRule.ExpandEnvironment ("%MyEnvironmentVariables%")
スクリプトを実行しているユーザの環境変数を展開します。
WScript. シェルを使用して環境変数を展開すると、SYSTEM 変数のみが返されます。
Windows PowerShell スクリプト
スクリプトが値0の (exits) を返す場合、スクリプトが成功し、ルールが適用されます。ゼロ以外の値が返される場合、スクリプトが失敗し、ルールは適用されません。
各 PowerShell スクリプトは PowerShell.exe のインスタンスで実行されるため、Application Control は特定の構文を強制も追加もしません。すべて正しい形式の PowerShell が動作します。
PowerShell は、スクリプトを使用するエンドポイントにインストールする必要があります。
スクリプト化されたルールの追加
-
[ルール] リボンで [ルールの追加] ドロップダウン矢印をクリックし、[スクリプト化されたルール] を選択します。
新しいルールがすべての [スクリプト化されたルール] 作業領域に追加されます。[スクリプト化されたルール] ダイアログが表示されます。
- スクリプトを入力し、次のいずれかを実行します。
- [現在のスクリプト] 領域にスクリプトを入力します。
- スクリプト エディタで既存のスクリプトを開き、コンテンツをコピー/切り取りして、貼り付けます。
- [ここをクリックしてスクリプトを編集] を選択します。[インポート] をクリックして、既存のスクリプトをインポートします。
スクリプト化されたルールの編集
- [スクリプト化されたルール] ダイアログを使用して、ユーザがログオンするたびに実行されるカスタム VB および PowerShell スクリプトに基づいて、ルールを作成および管理します。
- 特定のルールの [スクリプト化されたルール] ダイアログを開くには、次のいずれかを実行できます。
- ナビゲーション ペインでスクリプト化されたルールに移動し、選択します。
ナビゲーション ツリーで、ルール ノードを選択します。[すべてのルール] ダイアログで、編集するルールをダブルクリックします。
[スクリプト化されたルール] ダイアログが表示されます。
-
[ここをクリックしてスクリプトを編集] をクリックします。
[このスクリプト化されたルールの構成] ダイアログが表示されます
- [スクリプト] タブで、ユーザがログオンするときに使用するスクリプトを追加または修正します。
- [オプション] タブの [実行設定の定義] セクションで、使用可能なオプションのリストから、スクリプト実行設定を選択します。
- スクリプト時間設定を指定するには、[スクリプト時間設定] セクションで該当するオプションを選択します。
- OK をクリックします。
サンプル スクリプト
次の VBScript は、ユーザがアクセスできるアプリケーションを制御する方法を示します。
Function ScriptedRule()
’成功が予期されるフィルタ スキャンの名前
ExpectedFilter = "FWALL"
’サーバ名の取得
Set objNTinfo = CreateObject ("WinNTSystemInfo")
ServerName = lcase (objNTInfo.ComputerName)
’初期戻り値を設定
ScriptedRule = False
’MetaFrame セッション オブジェクトの作成
Set MFSession = Createobject ("MetaFrameCOM.MetaFrameSession")
’このセッション用のセッション フィルタを初期化
For Each x in MFSession.SmartAccessFilters
’フィルタが見つかった場合は true を返す
If x = ExpectedFilter Then
ScriptedRule=True
AMScriptRule.Log "SmartAccessFilter match found."
End If
Next
End Function
次の VBScript を使用して、コンピュータがコンピュータ組織単位にあるかどうかを判定できます。
Function ScriptedRule()
ScriptedRule = vbFalse
strCompName = AMScriptRule.StationName
Set oRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = oRootDSE.Get("DefaultNamingContext")
Set oOU = GetObject("LDAP://OU=TheOUyouAreSearching,OU=Parent,OU=Parent," & strDNSDomain)
oOU.GetInfo
For each member in oOU
If UCase(strCompName) = UCase(member.CN) Then
ScriptedRule = vbTrue
Exit For
End If
Next
End Function
次のサンプル VBScript は、スクリプトのメイン コンポーネントを示し、システムにログオンするユーザのユーザ名の情報にアクセスし、特定のドメインと組織単位に照合する方法を示します。
Function MyScript()
'ログインするユーザのユーザ名を取得 (SYSTEM として実行している場合にも機能します)
strUserName = AMScriptRule.UserName
'ログインするユーザのドメインを取得 (SYSTEM として実行している場合にも機能します)
strUserDomain = AMScriptRule.UserDomain
'ユーザ環境変数をルックアップ (SYSTEM として実行している場合は、システム変数のみ入手できます)
strClientName = AMScriptRule.ExpandEnvironment ("%ClientName%")
'出力をログに記録
AMScriptRule.Log strUserName & " logged in on " & strClientName
'ユーザがドメインのメンバーであるかどうかを確認
If strUserdomain = "MyDomain" Then
'メンバーであれば、そのユーザが MyOU OU 内にいるかどうかを確認
Set objOU = GetObject ("LDAP://ou=MyOU,dc=MyDomain,dc=com")
objOU.Filter = Array("user")
For Each objUser In objOU
'ログオンするユーザとの一致があるかどうかを確認
If objUser.sAMAccountName = strUserName Then
'ある場合は、関数を True に設定
MyScript = True
End If
Next
End If
'ユーザ名の一致がない場合、関数は既定で False に設定される
End Function
次のサンプル Windows PowerShell は、スクリプトのメイン コンポーネントを示し、システムにログオンするユーザのユーザ名の情報にアクセスし、特定のドメインと組織単位に照合する方法を示します。
#現行ユーザが指定された OU のメンバーであるかどうかを確認するスクリプト
# Return 0 if TRUE
# 1 otherwise
$logonuser = $env:username
$bindpt = [adsi] "LDAP://OU=TS_Users,OU=Users,OU=MyUser,OU=MyOU,DC=MyDomain,DC=com"
$users = New-Object System.DirectoryServices.DirectorySearcher $bindpt
$users.Filter = "(&(objectClass=User)(sAMAccountName=$logonuser))"
$obj = $users.FindOne()
if($obj -eq $null)
{
#" Not a Member"
exit 1
}