我正在創建用於檢查許可證的服務。作爲此服務的一部分,我們需要使用第三方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。
你讓我很快樂。它現在完美運作。我提供的代碼是在RoleEntryPoint.OnStart方法中,但仍然出現錯誤。腳本和taskType中的更改確實有效!非常感謝你 ! – Martijn
不客氣:-) –