This commit is contained in:
me 2015-03-16 07:47:09 +04:00
commit ec898f2392
10 changed files with 272 additions and 269 deletions

View file

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WebsitePanel.Providers.Virtualization
{
public enum AutomaticStartAction
{
Undefined = 100,
Nothing = 0,
StartIfRunning = 1,
Start = 2,
}
}

View file

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WebsitePanel.Providers.Virtualization
{
public enum AutomaticStopAction
{
Undefined = 100,
TurnOff = 0,
Save = 1,
ShutDown = 2,
}
}

View file

@ -288,6 +288,8 @@
<Compile Include="Statistics\StatsServer.cs" /> <Compile Include="Statistics\StatsServer.cs" />
<Compile Include="Statistics\StatsSite.cs" /> <Compile Include="Statistics\StatsSite.cs" />
<Compile Include="Statistics\StatsUser.cs" /> <Compile Include="Statistics\StatsUser.cs" />
<Compile Include="Virtualization\AutomaticStopAction.cs" />
<Compile Include="Virtualization\AutomaticStartAction.cs" />
<Compile Include="Virtualization\BiosInfo.cs" /> <Compile Include="Virtualization\BiosInfo.cs" />
<Compile Include="Virtualization\ChangeJobStateReturnCode.cs" /> <Compile Include="Virtualization\ChangeJobStateReturnCode.cs" />
<Compile Include="Virtualization\ConcreteJob.cs"> <Compile Include="Virtualization\ConcreteJob.cs">

View file

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WebsitePanel.Providers.Virtualization
{
public static class Constants
{
public const Int64 Size1G = 0x40000000;
public const Int64 Size1M = 0x100000;
}
}

View file

@ -87,7 +87,7 @@ namespace WebsitePanel.Providers.Virtualization
if (bootFromCD) if (bootFromCD)
cmd.Parameters.Add("FirstBootDevice", DvdDriveHelper.GetPS(powerShell, vm.Name)); cmd.Parameters.Add("FirstBootDevice", DvdDriveHelper.GetPS(powerShell, vm.Name));
else else
cmd.Parameters.Add("FirstBootDevice", VirtualMachineHelper.GetVirtualHardDisksPS(powerShell, vm.Name).FirstOrDefault()); cmd.Parameters.Add("FirstBootDevice", HardDriveHelper.GetPS(powerShell, vm.Name).FirstOrDefault());
powerShell.Execute(cmd, false); powerShell.Execute(cmd, false);
} }

View file

@ -0,0 +1,89 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
using System.Text;
using System.Threading.Tasks;
namespace WebsitePanel.Providers.Virtualization
{
public static class HardDriveHelper
{
public static VirtualHardDiskInfo[] Get(PowerShellManager powerShell, string vmname)
{
List<VirtualHardDiskInfo> disks = new List<VirtualHardDiskInfo>();
Collection<PSObject> result = GetPS(powerShell, vmname);
if (result != null && result.Count > 0)
{
foreach (PSObject d in result)
{
VirtualHardDiskInfo disk = new VirtualHardDiskInfo();
disk.SupportPersistentReservations = Convert.ToBoolean(d.GetProperty("SupportPersistentReservations"));
disk.MaximumIOPS = Convert.ToUInt64(d.GetProperty("MaximumIOPS"));
disk.MinimumIOPS = Convert.ToUInt64(d.GetProperty("MinimumIOPS"));
disk.VHDControllerType = d.GetEnum<ControllerType>("ControllerType");
disk.ControllerNumber = Convert.ToInt32(d.GetProperty("ControllerNumber"));
disk.ControllerLocation = Convert.ToInt32(d.GetProperty("ControllerLocation"));
disk.Path = d.GetProperty("Path").ToString();
disk.Name = d.GetProperty("Name").ToString();
GetVirtualHardDiskDetail(powerShell, disk.Path, ref disk);
disks.Add(disk);
}
}
return disks.ToArray();
}
//public static VirtualHardDiskInfo GetByPath(PowerShellManager powerShell, string vhdPath)
//{
// VirtualHardDiskInfo info = null;
// var vmNames = new List<string>();
// Command cmd = new Command("Get-VM");
// Collection<PSObject> result = powerShell.Execute(cmd, false);
// if (result == null || result.Count == 0)
// return null;
// vmNames = result.Select(r => r.GetString("Name")).ToList();
// var drives = vmNames.SelectMany(n => Get(powerShell, n));
// return drives.FirstOrDefault(d=>d.Path == vhdPath);
//}
public static Collection<PSObject> GetPS(PowerShellManager powerShell, string vmname)
{
Command cmd = new Command("Get-VMHardDiskDrive");
cmd.Parameters.Add("VMName", vmname);
return powerShell.Execute(cmd, false);
}
public static void GetVirtualHardDiskDetail(PowerShellManager powerShell, string path, ref VirtualHardDiskInfo disk)
{
if (!string.IsNullOrEmpty(path))
{
Command cmd = new Command("Get-VHD");
cmd.Parameters.Add("Path", path);
Collection<PSObject> result = powerShell.Execute(cmd, false);
if (result != null && result.Count > 0)
{
disk.DiskFormat = result[0].GetEnum<VirtualHardDiskFormat>("VhdFormat");
disk.DiskType = result[0].GetEnum<VirtualHardDiskType>("VhdType");
disk.ParentPath = result[0].GetProperty<string>("ParentPath");
disk.MaxInternalSize = Convert.ToInt64(result[0].GetProperty("Size"));
disk.FileSize = Convert.ToInt64(result[0].GetProperty("FileSize"));
disk.Attached = disk.InUse = Convert.ToBoolean(result[0].GetProperty("Attached"));
}
}
}
}
}

View file

@ -12,16 +12,8 @@ namespace WebsitePanel.Providers.Virtualization
{ {
public static class VirtualMachineHelper public static class VirtualMachineHelper
{ {
#region Constants
private const Int64 Size1G = 0x40000000;
private const Int64 Size1M = 0x100000;
#endregion
public static OperationalStatus GetVMHeartBeatStatus(PowerShellManager powerShell, string name) public static OperationalStatus GetVMHeartBeatStatus(PowerShellManager powerShell, string name)
{ {
OperationalStatus status = OperationalStatus.None; OperationalStatus status = OperationalStatus.None;
Command cmd = new Command("Get-VMIntegrationService"); Command cmd = new Command("Get-VMIntegrationService");
@ -40,7 +32,6 @@ namespace WebsitePanel.Providers.Virtualization
return status; return status;
} }
public static int GetVMProcessors(PowerShellManager powerShell, string name) public static int GetVMProcessors(PowerShellManager powerShell, string name)
{ {
@ -71,73 +62,15 @@ namespace WebsitePanel.Providers.Virtualization
if (result != null && result.Count > 0) if (result != null && result.Count > 0)
{ {
info.DynamicMemoryEnabled = Convert.ToBoolean(result[0].GetProperty("DynamicMemoryEnabled")); info.DynamicMemoryEnabled = Convert.ToBoolean(result[0].GetProperty("DynamicMemoryEnabled"));
info.Startup = Convert.ToInt64(result[0].GetProperty("Startup")) / Size1M; info.Startup = Convert.ToInt64(result[0].GetProperty("Startup")) / Constants.Size1M;
info.Minimum = Convert.ToInt64(result[0].GetProperty("Minimum")) / Size1M; info.Minimum = Convert.ToInt64(result[0].GetProperty("Minimum")) / Constants.Size1M;
info.Maximum = Convert.ToInt64(result[0].GetProperty("Maximum")) / Size1M; info.Maximum = Convert.ToInt64(result[0].GetProperty("Maximum")) / Constants.Size1M;
info.Buffer = Convert.ToInt32(result[0].GetProperty("Buffer")); info.Buffer = Convert.ToInt32(result[0].GetProperty("Buffer"));
info.Priority = Convert.ToInt32(result[0].GetProperty("Priority")); info.Priority = Convert.ToInt32(result[0].GetProperty("Priority"));
} }
return info; return info;
} }
public static VirtualHardDiskInfo[] GetVirtualHardDisks(PowerShellManager powerShell, string name)
{
List<VirtualHardDiskInfo> disks = new List<VirtualHardDiskInfo>();
Collection<PSObject> result = GetVirtualHardDisksPS(powerShell, name);
if (result != null && result.Count > 0)
{
foreach (PSObject d in result)
{
VirtualHardDiskInfo disk = new VirtualHardDiskInfo();
disk.SupportPersistentReservations = Convert.ToBoolean(d.GetProperty("SupportPersistentReservations"));
disk.MaximumIOPS = Convert.ToUInt64(d.GetProperty("MaximumIOPS"));
disk.MinimumIOPS = Convert.ToUInt64(d.GetProperty("MinimumIOPS"));
disk.VHDControllerType = d.GetEnum<ControllerType>("ControllerType");
disk.ControllerNumber = Convert.ToInt32(d.GetProperty("ControllerNumber"));
disk.ControllerLocation = Convert.ToInt32(d.GetProperty("ControllerLocation"));
disk.Path = d.GetProperty("Path").ToString();
disk.Name = d.GetProperty("Name").ToString();
GetVirtualHardDiskDetail(powerShell, disk.Path, ref disk);
disks.Add(disk);
}
}
return disks.ToArray();
}
public static Collection<PSObject> GetVirtualHardDisksPS(PowerShellManager powerShell, string name)
{
Command cmd = new Command("Get-VMHardDiskDrive");
cmd.Parameters.Add("VMName", name);
return powerShell.Execute(cmd, false);
}
public static void GetVirtualHardDiskDetail(PowerShellManager powerShell, string path, ref VirtualHardDiskInfo disk)
{
if (!string.IsNullOrEmpty(path))
{
Command cmd = new Command("Get-VHD");
cmd.Parameters.Add("Path", path);
Collection<PSObject> result = powerShell.Execute(cmd, false);
if (result != null && result.Count > 0)
{
disk.DiskFormat = result[0].GetEnum<VirtualHardDiskFormat>("VhdFormat");
disk.DiskType = result[0].GetEnum<VirtualHardDiskType>("VhdType");
disk.ParentPath = result[0].GetProperty<string>("ParentPath");
disk.MaxInternalSize = Convert.ToInt64(result[0].GetProperty("Size")) / Size1G;
disk.FileSize = Convert.ToInt64(result[0].GetProperty("FileSize")) / Size1G;
disk.Attached = Convert.ToBoolean(result[0].GetProperty("Attached"));
}
}
}
public static void UpdateProcessors(PowerShellManager powerShell, VirtualMachine vm, int cpuCores, int cpuLimitSettings, int cpuReserveSettings, int cpuWeightSettings) public static void UpdateProcessors(PowerShellManager powerShell, VirtualMachine vm, int cpuCores, int cpuLimitSettings, int cpuReserveSettings, int cpuWeightSettings)
{ {
Command cmd = new Command("Set-VMProcessor"); Command cmd = new Command("Set-VMProcessor");
@ -150,12 +83,13 @@ namespace WebsitePanel.Providers.Virtualization
powerShell.Execute(cmd, false); powerShell.Execute(cmd, false);
} }
public static void UpdateMemory(PowerShellManager powerShell, VirtualMachine vm, long ramMB) public static void UpdateMemory(PowerShellManager powerShell, VirtualMachine vm, long ramMB)
{ {
Command cmd = new Command("Set-VMMemory"); Command cmd = new Command("Set-VMMemory");
cmd.Parameters.Add("VMName", vm.Name); cmd.Parameters.Add("VMName", vm.Name);
cmd.Parameters.Add("StartupBytes", ramMB * Size1M); cmd.Parameters.Add("StartupBytes", ramMB * Constants.Size1M);
powerShell.Execute(cmd, false); powerShell.Execute(cmd, false);
} }

View file

@ -198,12 +198,12 @@ namespace WebsitePanel.Providers.Virtualization
vm.DvdDriveInstalled = dvdInfo != null; vm.DvdDriveInstalled = dvdInfo != null;
// HDD // HDD
vm.Disks = VirtualMachineHelper.GetVirtualHardDisks(PowerShell, vm.Name); vm.Disks = HardDriveHelper.Get(PowerShell, vm.Name);
if (vm.Disks != null && vm.Disks.GetLength(0) > 0) if (vm.Disks != null && vm.Disks.GetLength(0) > 0)
{ {
vm.VirtualHardDrivePath = vm.Disks[0].Path; vm.VirtualHardDrivePath = vm.Disks[0].Path;
vm.HddSize = Convert.ToInt32(vm.Disks[0].FileSize); vm.HddSize = Convert.ToInt32(vm.Disks[0].FileSize / Size1G);
} }
// network adapters // network adapters
@ -327,104 +327,46 @@ namespace WebsitePanel.Providers.Virtualization
vm.OperatingSystemTemplatePath = FileUtils.EvaluateSystemVariables(vm.OperatingSystemTemplatePath); vm.OperatingSystemTemplatePath = FileUtils.EvaluateSystemVariables(vm.OperatingSystemTemplatePath);
vm.VirtualHardDrivePath = FileUtils.EvaluateSystemVariables(vm.VirtualHardDrivePath); vm.VirtualHardDrivePath = FileUtils.EvaluateSystemVariables(vm.VirtualHardDrivePath);
string vmID = null; try
{
// request management service // Add new VM
ManagementObject objVmsvc = GetVirtualSystemManagementService(); Command cmdNew = new Command("New-VM");
cmdNew.Parameters.Add("Name", vm.Name);
// display name cmdNew.Parameters.Add("VHDPath", vm.VirtualHardDrivePath);
ManagementObject objGlobalSettings = wmi.GetWmiClass("msvm_VirtualSystemGlobalSettingData").CreateInstance(); PowerShell.Execute(cmdNew, false);
objGlobalSettings["ElementName"] = vm.Name;
// VM folders
objGlobalSettings["ExternalDataRoot"] = vm.RootFolderPath;
objGlobalSettings["SnapshotDataRoot"] = vm.RootFolderPath;
wmi.Dump(objGlobalSettings);
// Set VM
Command cmdSet = new Command("Set-VM");
cmdSet.Parameters.Add("Name", vm.Name);
cmdSet.Parameters.Add("SmartPagingFilePath", vm.RootFolderPath);
cmdSet.Parameters.Add("SnapshotFileLocation", vm.RootFolderPath);
// startup/shutdown actions // startup/shutdown actions
if (AutomaticStartActionSettings != 100) var autoStartAction = (AutomaticStartAction) AutomaticStartActionSettings;
var autoStopAction = (AutomaticStopAction) AutomaticStartActionSettings;
if (autoStartAction != AutomaticStartAction.Undefined)
{ {
objGlobalSettings["AutomaticStartupAction"] = AutomaticStartActionSettings; cmdSet.Parameters.Add("AutomaticStartAction", autoStartAction.ToString());
objGlobalSettings["AutomaticStartupActionDelay"] = String.Format("000000000000{0:d2}.000000:000", AutomaticStartupDelaySettings); cmdSet.Parameters.Add("AutomaticStartDelay", AutomaticStartupDelaySettings);
}
if (autoStopAction != AutomaticStopAction.Undefined)
cmdSet.Parameters.Add("AutomaticStopAction", autoStopAction.ToString());
PowerShell.Execute(cmdSet, false);
// Get created machine Id
var createdMachine = GetVirtualMachines().FirstOrDefault(m => m.Name == vm.Name);
if (createdMachine == null)
throw new Exception("Can't find created machine");
vm.VirtualMachineId = createdMachine.VirtualMachineId;
// Update common settings
UpdateVirtualMachine(vm);
}
catch (Exception ex)
{
HostedSolutionLog.LogError("CreateVirtualMachine", ex);
throw;
} }
if (AutomaticStopActionSettings != 100)
objGlobalSettings["AutomaticShutdownAction"] = AutomaticStopActionSettings;
if (AutomaticRecoveryActionSettings != 100)
objGlobalSettings["AutomaticRecoveryAction"] = AutomaticRecoveryActionSettings;
// create machine
ManagementBaseObject inParams = objVmsvc.GetMethodParameters("DefineVirtualSystem");
inParams["SystemSettingData"] = objGlobalSettings.GetText(TextFormat.CimDtd20);
inParams["ResourceSettingData"] = new string[] { };
// invoke method
ManagementBaseObject outParams = objVmsvc.InvokeMethod("DefineVirtualSystem", inParams, null);
ManagementObject objVM = wmi.GetWmiObjectByPath((string)outParams["DefinedSystem"]);
// job
JobResult job = CreateJobResultFromWmiMethodResults(outParams); ;
// read VM id
vmID = (string)objVM["Name"];
// update general settings
//UpdateVirtualMachineGeneralSettings(vmID, objVM,
// vm.CpuCores,
// vm.RamSize,
// vm.BootFromCD,
// vm.NumLockEnabled);
// hard disks
// load IDE 0 controller
ManagementObject objIDE0 = wmi.GetWmiObject(
"Msvm_ResourceAllocationSettingData", "ResourceSubType = 'Microsoft Emulated IDE Controller'"
+ " and InstanceID Like 'Microsoft:{0}%' and Address = 0", vmID);
// load default hard disk drive
ManagementObject objDefaultHdd = wmi.GetWmiObject(
"Msvm_ResourceAllocationSettingData", "ResourceSubType = 'Microsoft Synthetic Disk Drive'"
+ " and InstanceID like '%Default'");
ManagementObject objHdd = (ManagementObject)objDefaultHdd.Clone();
objHdd["Parent"] = objIDE0.Path;
objHdd["Address"] = 0;
// add HDD to VM resources
ManagementObject objAddedHDD = AddVirtualMachineResources(objVM, objHdd);
// attach VHD
string fullVhdPath = vm.VirtualHardDrivePath;
ManagementObject objDefaultVHD = wmi.GetWmiObject(
"Msvm_ResourceAllocationSettingData", "ResourceSubType = 'Microsoft Virtual Hard Disk'"
+ " and InstanceID like '%Default'");
ManagementObject objVhd = (ManagementObject)objDefaultVHD.Clone();
objVhd["Parent"] = objAddedHDD.Path.Path;
objVhd["Connection"] = new string[] { fullVhdPath };
// add VHD to the system
AddVirtualMachineResources(objVM, objVhd);
// DVD drive
if (vm.DvdDriveInstalled)
{
AddVirtualMachineDvdDrive(vmID, objVM);
}
// add external adapter
if (vm.ExternalNetworkEnabled && !String.IsNullOrEmpty(vm.ExternalSwitchId))
AddNetworkAdapter(objVM, vm.ExternalSwitchId, vm.Name, vm.ExternalNicMacAddress, EXTERNAL_NETWORK_ADAPTER_NAME, vm.LegacyNetworkAdapter);
// add private adapter
if (vm.PrivateNetworkEnabled && !String.IsNullOrEmpty(vm.PrivateSwitchId))
AddNetworkAdapter(objVM, vm.PrivateSwitchId, vm.Name, vm.PrivateNicMacAddress, PRIVATE_NETWORK_ADAPTER_NAME, vm.LegacyNetworkAdapter);
// add management adapter
if (vm.ManagementNetworkEnabled && !String.IsNullOrEmpty(vm.ManagementSwitchId))
AddNetworkAdapter(objVM, vm.ManagementSwitchId, vm.Name, vm.ManagementNicMacAddress, MANAGEMENT_NETWORK_ADAPTER_NAME, vm.LegacyNetworkAdapter);
vm.VirtualMachineId = vmID;
return vm; return vm;
} }
@ -1483,33 +1425,17 @@ namespace WebsitePanel.Providers.Virtualization
#region Storage #region Storage
public VirtualHardDiskInfo GetVirtualHardDiskInfo(string vhdPath) public VirtualHardDiskInfo GetVirtualHardDiskInfo(string vhdPath)
{ {
ManagementObject objImgSvc = GetImageManagementService(); try
// get method params
ManagementBaseObject inParams = objImgSvc.GetMethodParameters("GetVirtualHardDiskInfo");
inParams["Path"] = FileUtils.EvaluateSystemVariables(vhdPath);
// execute method
ManagementBaseObject outParams = (ManagementBaseObject)objImgSvc.InvokeMethod("GetVirtualHardDiskInfo", inParams, null);
ReturnCode result = (ReturnCode)Convert.ToInt32(outParams["ReturnValue"]);
if (result == ReturnCode.OK)
{ {
// create XML VirtualHardDiskInfo hardDiskInfo = new VirtualHardDiskInfo();
string xml = (string)outParams["Info"]; HardDriveHelper.GetVirtualHardDiskDetail(PowerShell, vhdPath, ref hardDiskInfo);
XmlDocument doc = new XmlDocument(); return hardDiskInfo;
doc.LoadXml(xml); }
catch (Exception ex)
// read properties {
VirtualHardDiskInfo vhd = new VirtualHardDiskInfo(); HostedSolutionLog.LogError("GetVirtualHardDiskInfo", ex);
vhd.DiskType = (VirtualHardDiskType)Enum.Parse(typeof(VirtualHardDiskType), GetPropertyValue("Type", doc), true); throw;
vhd.FileSize = Int64.Parse(GetPropertyValue("FileSize", doc));
vhd.InSavedState = Boolean.Parse(GetPropertyValue("InSavedState", doc));
vhd.InUse = Boolean.Parse(GetPropertyValue("InUse", doc));
vhd.MaxInternalSize = Int64.Parse(GetPropertyValue("MaxInternalSize", doc));
vhd.ParentPath = GetPropertyValue("ParentPath", doc);
return vhd;
} }
return null;
} }
private string GetPropertyValue(string propertyName, XmlDocument doc) private string GetPropertyValue(string propertyName, XmlDocument doc)
@ -1741,9 +1667,6 @@ exit", Convert.ToInt32(objDisk["Index"])));
public JobResult ConvertVirtualHardDisk(string sourcePath, string destinationPath, VirtualHardDiskType diskType) public JobResult ConvertVirtualHardDisk(string sourcePath, string destinationPath, VirtualHardDiskType diskType)
{ {
sourcePath = FileUtils.EvaluateSystemVariables(sourcePath);
destinationPath = FileUtils.EvaluateSystemVariables(destinationPath);
// check source file // check source file
if (!FileExists(sourcePath)) if (!FileExists(sourcePath))
throw new Exception("Source VHD cannot be found: " + sourcePath); throw new Exception("Source VHD cannot be found: " + sourcePath);
@ -1753,16 +1676,25 @@ exit", Convert.ToInt32(objDisk["Index"])));
if (!DirectoryExists(destFolder)) if (!DirectoryExists(destFolder))
CreateFolder(destFolder); CreateFolder(destFolder);
ManagementObject objImgSvc = GetImageManagementService(); sourcePath = FileUtils.EvaluateSystemVariables(sourcePath);
destinationPath = FileUtils.EvaluateSystemVariables(destinationPath);
// get method params try
ManagementBaseObject inParams = objImgSvc.GetMethodParameters("ConvertVirtualHardDisk"); {
inParams["SourcePath"] = sourcePath; Command cmd = new Command("Convert-VHD");
inParams["DestinationPath"] = destinationPath;
inParams["Type"] = (UInt16)diskType;
ManagementBaseObject outParams = (ManagementBaseObject)objImgSvc.InvokeMethod("ConvertVirtualHardDisk", inParams, null); cmd.Parameters.Add("Path", sourcePath);
return CreateJobResultFromWmiMethodResults(outParams); cmd.Parameters.Add("DestinationPath", destinationPath);
cmd.Parameters.Add("VHDType", diskType.ToString());
PowerShell.Execute(cmd, false);
return JobHelper.CreateSuccessResult(ReturnCode.JobStarted);
}
catch (Exception ex)
{
HostedSolutionLog.LogError("ConvertVirtualHardDisk", ex);
throw;
}
} }
public void DeleteRemoteFile(string path) public void DeleteRemoteFile(string path)

View file

@ -17,7 +17,7 @@
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<Optimize>false</Optimize> <Optimize>false</Optimize>
<OutputPath>..\WebsitePanel.Server\bin\</OutputPath> <OutputPath>..\WebsitePanel.Server\bin\HyperV2012R2\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
@ -53,8 +53,10 @@
<Compile Include="..\VersionInfo.cs"> <Compile Include="..\VersionInfo.cs">
<Link>VersionInfo.cs</Link> <Link>VersionInfo.cs</Link>
</Compile> </Compile>
<Compile Include="Constants.cs" />
<Compile Include="Extensions\PSObjectExtension.cs" /> <Compile Include="Extensions\PSObjectExtension.cs" />
<Compile Include="Helpers\BiosHelper.cs" /> <Compile Include="Helpers\BiosHelper.cs" />
<Compile Include="Helpers\HardDriveHelper.cs" />
<Compile Include="Helpers\NetworkAdapterHelper.cs" /> <Compile Include="Helpers\NetworkAdapterHelper.cs" />
<Compile Include="Helpers\DvdDriveHelper.cs" /> <Compile Include="Helpers\DvdDriveHelper.cs" />
<Compile Include="Helpers\JobHelper.cs" /> <Compile Include="Helpers\JobHelper.cs" />

View file

@ -1,4 +1,4 @@
<?xml version="1.0"?> <?xml version="1.0" encoding="utf-8"?>
<configuration> <configuration>
<!-- Custom configuration sections --> <!-- Custom configuration sections -->
<configSections> <configSections>
@ -162,7 +162,7 @@
</dependentAssembly> </dependentAssembly>
</assemblyBinding> </assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin/Crm2011;bin/Crm2013;bin/Exchange2013;bin/Sharepoint2013;bin/Lync2013;bin/Lync2013HP;bin/Dns2012;bin/IceWarp;bin/IIs80"/> <probing privatePath="bin/Crm2011;bin/Crm2013;bin/Exchange2013;bin/Sharepoint2013;bin/Lync2013;bin/Lync2013HP;bin/Dns2012;bin/IceWarp;bin/IIs80;bin/HyperV2012R2" />
</assemblyBinding> </assemblyBinding>
</runtime> </runtime>
</configuration> </configuration>