2016-11-11 73 views
3

我正在創建用於檢查許可證的服務。作爲此服務的一部分,我們需要使用第三方DLL。此服務(WCF服務,C#)作爲雲服務在Azure上託管。部署完成後,我需要轉到雲服務的VM來手動註冊該DLL,併爲該服務提供IIS中使用第三方DLL的正確權限。如何在Azure雲服務上使用第三方DLL

我想通過腳本/代碼在IIS中執行此配置。因爲如果cloudservces虛擬機重新啓動以進行更新,配置將丟失並且必須再次手動設置。

DLL本身的註冊由腳本(registerCOM.cmd)完成,並且是servicedefinition.csdef的一部分。

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

此腳本包含一個條目:

start "" "lpregister410.EXE" 

這個腳本啓動一個可執行文件和註冊的第三方DLL。到目前爲止,一切正常

但我無法獲得通過腳本消耗DLL的服務。這意味着我可以使服務工作,但我必須手動設置IIS。在這種情況下,我必須將應用程序池中的此應用程序的標識從「網絡」設置爲「本地系統」。我試過把這個選項創建成一個PowerShell腳本,然後由一個cmd(ConfigureIIS.cmd)腳本觸發它:我不是一個IIS專家,但看到此選項多次選擇並且解決方案有效,

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

這ConfigureIIS.cmd腳本包含:

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

PowerShell腳本做到這一點:

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 
    }  
} 

此腳本背後的想法是Azure爲服務提供了隨機Guid名稱。這個Guid包含至少32個字符。如果找到,將identityType更改爲0(LocalSytem)(僅託管一項服務)

好的,那麼問題是什麼。如果我在Cloudservices虛擬機上運行這個腳本手冊,沒問題。工作正常,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和解釋,遺憾的是的,但我希望有人可以給我在正確的方向上推。主要問題是如何在不與Cloud Service進行手動交互的情況下使用此第三方DLL。

回答

2

按照documentation

IS可能不完全過程中 啓動過程的啓動任務階段配置的,所以角色特定的數據可能無法使用。啓動 需要角色特定數據的任務應該使用Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.OnStart 。

如果OnStart方法不爲你工作,嘗試改變的ConfigureIIS.cmdbackground(它將異步運行)的taskType,並採用腳本等到應用程序池配置:

<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

不客氣:-) –