2016-11-11 12 views
3

私はライセンスを確認するためのサービスを作成しています。このサービスの一環として、サードパーティのDLLを使用する必要があります。このサービス(WCFサービス、C#)は、クラウドサービスとして青空でホストされています。展開後、私はクラウドサービスのVMに手動でDLLを登録し、サードパーティのDLLを使用するIISで正しい権利をサービスに与える必要があります。AzureクラウドサービスでサードパーティのDLLを使用する方法

IISでこの設定をスクリプト/コードで実行します。クラウドがVMを再起動して更新を再開すると、設定が失われ、再度手動で設定する必要があるためです。

DLL自体の登録はスクリプト(registerCOM.cmd)によって行われ、servicedefinition.csdefの一部です。このスクリプトは、実行可能ファイルを起動し、サードパーティのDLLを登録

start "" "lpregister410.EXE" 

<Startup> 
    <Task commandLine="RegisterCOM.cmd" executionContext="elevated" taskType="simple" />  
</Startup> 

は、このスクリプトは、一つのエントリが含まれています。これまでのすべてが動作します

しかし、スクリプトでDLLを使用するサービスを取得できません。つまり、サービスを稼働させることができますが、手動でIISを設定する必要があります。私はこの場合、アプリケーションプール内のこのアプリケーションのIDを「ネットワーク」から「LocalSystem」に設定する必要があります。

私はIISのエキスパートではありませんが、このオプションが何度も選択されていて、ソリューションが動作するのを見て、これをpowershellスクリプトに作成しようとしましたが、これはcmd(ConfigureIIS.cmd)

<Startup> 
    <Task commandLine="RegisterCOM.cmd" executionContext="elevated" taskType="simple" /> 
    <Task commandLine="ConfigureIIS.cmd" executionContext="elevated" taskType="simple" /> 
</Startup> 

このConfigureIIS.cmdスクリプトが含まれています

Import-Module WebAdministration 
$applicationPools = Get-ChildItem IIS:\AppPools 

foreach($pool in $applicationPools) 
{  
    If($pool.name.length -gt 32) 
    { 
     $pool.processModel.identityType = 0 
     $pool | Set-Item 
     $bool = $true 
    }  
} 

PowerShell.exe -NoProfile -ExecutionPolicy Unrestricted -Command "& '%~dpn0.ps1'" 

PowerShellスクリプトは、このありません

このスクリプトの背後にあるアイデアは、AzureがサービスにランダムなGuidの名前を付けることです。このGUIDには少なくとも32文字が含まれています。見つかった場合、identityTypeを0(LocalSytem)に変更してください(1つのサービスのみがホストされています)。

問題があります。 Cloudservices VMでこのスクリプトマニュアルを実行すると、問題はありません。正しく動作し、IISが正しく設定されています。しかし、パブリッシュを実行すると、IISは設定されません。 (私は、サービスがまだアプリケーションプールに追加されていないので、それは正しい仮定ですか?)私は、アプリケーションからスクリプトを発射するとき、それは私が十分な権限を持っていない私に指示(私はcloudserviceは、デフォルトの「管理者」であると考えられる)

私はこのようなコードでは、上記のすべて行うと:

{ 
       ServerManager serverManager = new ServerManager();         
       sb.Append("ServerManager Created"); 
       ApplicationPoolCollection applicationPools = serverManager.ApplicationPools; 
       sb.Append("Number of pools detected: " + applicationPools.Count.ToString());   
       foreach (ApplicationPool pool in applicationPools) 
       {     
        sb.Append(pool.Name); 
        if (pool.Name.Length > 32) { 
         sb.Append(pool.Name + " has been found");       
         pool.ProcessModel.IdentityType = ProcessModelIdentityType.LocalSystem;      
         sb.Append(pool.Name + " has identity been changed to " + pool.ProcessModel.IdentityType.ToString() + ", "); 
         sb.Append("Trying to commit changes, "); 
         serverManager.CommitChanges(); 
         sb.Append("Changes Committed ! "); 
        }      
       }       
      } 

それは

serverManager.CommitChanges(); 

で変更を保存するときだから、そのために残念tekstと説明の多くは、ですが、私は誰かが私に正しい方向にプッシュを与えることができることを願ってくれ「ではない十分な権限」を与えます。主な問題は、クラウドサービスとの手動による対話なしで、このサードパーティのDLLをどのように使用できるかです。documentationによれば

答えて

2

は完全 起動処理における起動タスク段階で構成されなくてもよいですので、ロール固有のデータが利用可能でないかもしれません。スタートアップ ロール固有のデータが必要なタスクは、 Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.OnStartを使用する必要があります。

OnStart方法があなたのために動作しない場合は、backgroundConfigureIIS.cmdtaskTypeを変更する(それが非同期で実行されます)およびアプリケーションプールが設定されるまで待つようにスクリプトを採用しよう:

<Startup> 
    <Task commandLine="RegisterCOM.cmd" executionContext="elevated" taskType="simple" /> 
    <Task commandLine="ConfigureIIS.cmd" executionContext="elevated" taskType="background" /> 
</Startup> 

PowerShellスクリプト:

Import-Module WebAdministration 
$applicationPools = Get-ChildItem IIS:\AppPools 
$yourExpectedAppliactionPoolCount = 1; 

while ($applicationPools.Count -lt $yourExpectedAppliactionPoolCount) 
{ 
    Sleep -Seconds 3 
} 

foreach($pool in $applicationPools) 
{  
    If($pool.name.length -gt 32) 
    { 
     $pool.processModel.identityType = 0 
     $pool | Set-Item 
     $bool = $true 
    }  
} 
+0

あなたは私の一日行わ。それは今、完璧に機能します。私が提供したコードはRoleEntryPoint.OnStartメソッドにありましたが、まだエラーが発生します。スクリプトとtaskTypeの変更がトリックでした!どうもありがとうございました ! – Martijn

+0

あなたは歓迎です:-) –

関連する問題