0

ロール ベースのセキュリティを利用する COM+ アプリケーションがいくつかあります。トラブルシューティング中に、各コンポーネントを手動でチェックして、[コンポーネント レベルのアクセス チェックを強制する] ボックスと [選択した項目に明示的に設定されたロール] ボックスの両方がオンになっていることを確認するのは面倒です。

問題の半分は、以下のスクリプト (コンポーネント レベルのアクセス チェックを強制する) で対処されていますが、コンポーネントに割り当てられているロールのチェックボックスも有効になっているかどうかをプログラムで判断する方法を見つけるのに苦労しています。

どんな助けでも大歓迎です!

Clear-Host;

$comAdmin = New-Object -com ("COMAdmin.COMAdminCatalog.1");
$applications = $comAdmin.GetCollection("Applications") ;
$applications.Populate() ;
$appfilter = "ABC";

foreach ($application in $applications){

  if($application.name.substring(0,3) -eq $appfilter){

    try{    
          $components = $applications.GetCollection("Components",$application.key)
          $components.Populate()

          foreach ($component in $components){

            $componentName = $component.Name;
                Write-Host $componentName;

            $accesschecks = $component.Value("ComponentAccessChecksEnabled");

            Write-Host "Access Checks Enabled: " -NoNewLine;
            Switch ($accesschecks){
                $true{Write-Host $accesschecks -ForegroundColor Green}
                $false{Write-Host $accesschecks -ForegroundColor red -BackgroundColor white}
            }   

            $roles = $applications.GetCollection("Roles",$application.key) ;
            $roles.Populate();
            $rolename = $roles.Item(0).Name;

            #$roleenabled = !!???!!     

            Write-Host "Role: $rolename Enabled: " -NoNewLine;
            Switch ($roleenabled){
                $true{Write-Host $roleenabled -ForegroundColor Green}
                $false{Write-Host $roleenabled -ForegroundColor red -BackgroundColor white}
            } 
            Write-Host;

             }
    }
    catch{}
  }
Write-Host "-------------------------------------";
}

有効な役割を示す COM+ ダイアログの例

4

1 に答える 1

1

それを割った。コンポーネントのセキュリティ設定内でロール ボックスがチェックされていない場合、ロールはまったく存在しないかのように、RolesforComponent コレクションにリストされません。また、コンポーネントに複数のロールが割り当てられている可能性があるため、列挙する別のループが必要です。

Clear-Host;

$comAdmin = New-Object -com ("COMAdmin.COMAdminCatalog.1");
$applications = $comAdmin.GetCollection("Applications") ;
$applications.Populate() ;
$appfilter = "ABC";

foreach ($application in $applications){

    if($application.name.substring(0,3) -eq $appfilter){

            try{  

                    Write-Host $application.name -ForegroundColor White;
                   $components = $applications.GetCollection("Components",$application.key)
                $components.Populate()

                foreach ($component in $components){
                $componentName = $component.Name;
                    $componentID = $component.Value("CLSID");
                        Write-Host "*"$componentName;
                $accesschecks = $component.Value("ComponentAccessChecksEnabled");
                        Write-Host "  Access Checks Enabled: " -NoNewLine;

                  Switch ($accesschecks){
                       $true{Write-Host $accesschecks -ForegroundColor Blue -BackgroundColor Green}
                           $false{Write-Host $accesschecks -ForegroundColor White -BackgroundColor Red}
                            }
                }   

                        $RolesForComponent = $components.GetCollection("RolesForComponent",$component.Value("CLSID"))
                        $RolesForComponent.Populate();

                        If ($RolesForComponent.Count -eq 0){
                            Write-Host "  " -NoNewLine;
                            Write-Host "Check Roles!" -ForegroundColor White -BackgroundColor Red;
                        }
                        Else{
                            foreach ($role in $RolesForComponent){
                $rolename = $role.Name;
                            Write-Host "  " -NoNewLine;
                            Write-Host $rolename -NoNewLine;
                            Write-Host "  " -NoNewLine;
                            Write-Host "Role OK" -ForegroundColor Blue -BackgroundColor Green;
                            Write-Host;
                       }        
                        }
            }

        catch{}

    }
    Write-Host "----------------------------------------------------------------------";
}

詳細はこちらMSDN RolesForComponent コレクション

于 2012-11-08T15:12:36.840 に答える