2013-08-02 71 views
1

與許多人一樣,我們有Azure虛擬機,我們希望在不使用時銷燬Azure虛擬機,以便我們不必爲其核心使用付費。所有有問題的虛擬機都在同一個域中,並且DC/DNS服務器不會被銷燬/重新創建,並且具有靜態IP。但是,成功使用Export/Remove/Import-AzureVM組合後,網絡適配器的所有IP設置(DNS是我最關心的問題)都消失了,因爲每次使用Import- AzureVM。銷燬/重新創建虛擬機之後的Azure DNS問題

我最初嘗試在啓動時使用NETSH設置我的DNS條目,但它取決於知道適配器的名稱和適配器名稱每天更改(因爲我們將機器停下來在晚上重新創建它們早上)。我的下一個不太明智的想法是包含一個VBScript,它在啓動時將適配器重命名爲相同的名稱,以便NETSH始終具有相同的適配器名稱來處理。然而,正是在那個時候,我發現所有舊的適配器依然存在,但只是隱藏起來而沒有被使用,這讓我的計劃變得沒有意義。

下面是測試netsh命令和VBScript我嘗試使用,只是爲了容易參考,:

'this script was modified from one i got from the Scripting Guys 
Const NETWORK_CONNECTIONS = &H31& 

Set objShell = CreateObject("Shell.Application") 
Set objFolder = objShell.Namespace(NETWORK_CONNECTIONS) 

Set colItems = objFolder.Items 
For Each objItem in colItems 
'only one adapter is ever returned by this query, but it didn't seem like a bad idea to leave the loop alone just in case  
     objItem.Name = "testlan" 
    wscript.echo objItem.Name 
Next 

NETSH

netsh interface ip add dns name="testlan" 10.0.0.4 

我知道我不能成爲唯一的人試圖解決這個問題,但我一直無法通過大量的谷歌搜索和試驗和錯誤找到解決方案。非常感謝!

+1

Ben,Azure更改了他們的計費模式,並且您不再爲處於「已停止」狀態的虛擬機收費。現在,您可以關閉它們,而且不會收費。我知道這不是你的問題的答案,但可能是一個更簡單的方法。 – Nathan

+0

你有沒有設法找到一個基於DNS的解決方案? – paqogomez

回答

0

@納森的評論是不正確的。當虛擬機「停止」時,它仍然被計費。如果它是「停止(釋放)」,然後計費停止。從Azure's Pricing Details FAQ

爲了確保您不會收取費用,從管理 門戶停止VM。您還可以通過調用 ShutdowRoleOperation通過Powershell停止虛擬機,並使'PostShutdownAction'等於 「StoppedDeallocated」。但是,如果您通過調用ShutdownRoleOperation( 「PostShutdownAction」等於「已停止」)從內部關閉虛擬機(例如,使用Windows中的電源選項)或 通過PowerShell關閉虛擬機,您將繼續收費。

您可以使用Azure控制面板進入取消分配狀態,或使用Azure Cmdlet強制停止VM,而不銷燬VM。這將釋放,你不會有網絡問題。不幸的是,目前無法使用REST Api來完成這項工作。

我用下面的某個應用停止服務:該行於上的一個按鈕

RunPowerShellScript(@"Stop-AzureVM -ServiceName " + cloudServiceName + " -Name " + vmName + " -Force"); 

使用,或使用REST API來查詢您的雲服務,那麼下面的函數來運行你的PowerShell 。確保最初運行getting started

private string RunPowerShellScript(string scriptText) 
     { 
      // create Powershell runspace 
      Runspace runspace = RunspaceFactory.CreateRunspace(); 
      // open it 
      runspace.Open(); 
      // create a pipeline and feed it the script text 
      Pipeline pipeline = runspace.CreatePipeline(); 
      pipeline.Commands.AddScript(scriptText); 
      // add an extra command to transform the script 
      // output objects into nicely formatted strings 
      // remove this line to get the actual objects 
      // that the script returns. For example, the script 
      // "Get-Process" returns a collection 
      // of System.Diagnostics.Process instances. 
      pipeline.Commands.Add("Out-String"); 
      // execute the script 
      Collection<PSObject> results = pipeline.Invoke(); 
      // close the runspace 
      runspace.Close(); 
      // convert the script result into a single string 

      StringBuilder stringBuilder = new StringBuilder(); 
      foreach (PSObject obj in results) 
      { 
       stringBuilder.AppendLine(obj.ToString()); 
      } 
      return stringBuilder.ToString(); 
     } 
0

試試這個......

的Set-ExecutionPolicy不受限制


$ WMI = GET-WmiObject可以Win32_NetworkAdapterConfiguration的篩選器 「ipenabled = '真'」


$ wmi.SetDNSServerSearchOrder( 「10.0.2.6」)