Partial Check on DAAS, folder hard quota support added for 2012
This commit is contained in:
parent
1160035f01
commit
a27bbc6f4e
4 changed files with 249 additions and 7 deletions
|
@ -26,15 +26,247 @@
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Text;
|
||||
using System.Reflection;
|
||||
using System.Globalization;
|
||||
|
||||
using Microsoft.Win32;
|
||||
|
||||
using WebsitePanel.Providers;
|
||||
using WebsitePanel.Providers.HostedSolution;
|
||||
using WebsitePanel.Providers.Utils;
|
||||
using WebsitePanel.Server.Utils;
|
||||
|
||||
using System.Management;
|
||||
using System.Management.Automation;
|
||||
using System.Management.Automation.Runspaces;
|
||||
|
||||
using WebsitePanel.Providers.Common;
|
||||
using WebsitePanel.Providers;
|
||||
using WebsitePanel.Providers.HostedSolution;
|
||||
|
||||
|
||||
namespace WebsitePanel.Providers.OS
|
||||
{
|
||||
|
||||
public class Windows2012 : Windows2003
|
||||
{
|
||||
#region Properties
|
||||
internal string PrimaryDomainController
|
||||
{
|
||||
get { return ProviderSettings["PrimaryDomainController"]; }
|
||||
}
|
||||
|
||||
#endregion Properties
|
||||
|
||||
public override bool IsInstalled()
|
||||
{
|
||||
Server.Utils.OS.WindowsVersion version = WebsitePanel.Server.Utils.OS.GetVersion();
|
||||
return version == WebsitePanel.Server.Utils.OS.WindowsVersion.WindowsServer2012
|
||||
|| version == WebsitePanel.Server.Utils.OS.WindowsVersion.Windows8;
|
||||
}
|
||||
|
||||
public override void SetQuotaLimitOnFolder(string folderPath, string shareNameDrive, string quotaLimit, int mode, string wmiUserName, string wmiPassword)
|
||||
{
|
||||
Log.WriteStart("SetQuotaLimitOnFolder");
|
||||
Log.WriteInfo("FolderPath : {0}", folderPath);
|
||||
Log.WriteInfo("ShareNameDrive : {0}", shareNameDrive);
|
||||
Log.WriteInfo("QuotaLimit : {0}", quotaLimit);
|
||||
|
||||
Runspace runSpace = null;
|
||||
try
|
||||
{
|
||||
runSpace = OpenRunspace();
|
||||
string[] splits = folderPath.Split('\\');
|
||||
if (splits.Length > 0)
|
||||
{
|
||||
string sharePath = String.Empty;
|
||||
|
||||
if (splits.Length > 4)
|
||||
{
|
||||
// Form the share physicalPath
|
||||
sharePath = shareNameDrive + @":\" + splits[3];
|
||||
|
||||
if (splits.Length == 5 && !quotaLimit.Equals(String.Empty))
|
||||
{
|
||||
Command cmd = new Command("Set-FsrmQuota");
|
||||
cmd.Parameters.Add("Path", sharePath + @"\" + splits[4]);
|
||||
cmd.Parameters.Add("Size", quotaLimit);
|
||||
cmd.Parameters.Add("Confirm", true);
|
||||
ExecuteShellCommand(runSpace, cmd, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.WriteError("SetQuotaLimitOnFolder", ex);
|
||||
throw;
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
||||
CloseRunspace(runSpace);
|
||||
}
|
||||
|
||||
Log.WriteEnd("SetQuotaLimitOnFolder");
|
||||
}
|
||||
|
||||
#region PowerShell integration
|
||||
private static InitialSessionState session = null;
|
||||
|
||||
internal virtual Runspace OpenRunspace()
|
||||
{
|
||||
Log.WriteStart("OpenRunspace");
|
||||
|
||||
if (session == null)
|
||||
{
|
||||
session = InitialSessionState.CreateDefault();
|
||||
session.ImportPSModule(new string[] { "FileServerResourceManager" });
|
||||
}
|
||||
Runspace runSpace = RunspaceFactory.CreateRunspace(session);
|
||||
//
|
||||
runSpace.Open();
|
||||
//
|
||||
runSpace.SessionStateProxy.SetVariable("ConfirmPreference", "none");
|
||||
Log.WriteEnd("OpenRunspace");
|
||||
return runSpace;
|
||||
}
|
||||
|
||||
internal void CloseRunspace(Runspace runspace)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (runspace != null && runspace.RunspaceStateInfo.State == RunspaceState.Opened)
|
||||
{
|
||||
runspace.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.WriteError("Runspace error", ex);
|
||||
}
|
||||
}
|
||||
|
||||
internal Collection<PSObject> ExecuteShellCommand(Runspace runSpace, Command cmd)
|
||||
{
|
||||
return ExecuteShellCommand(runSpace, cmd, true);
|
||||
}
|
||||
|
||||
internal Collection<PSObject> ExecuteShellCommand(Runspace runSpace, Command cmd, bool useDomainController)
|
||||
{
|
||||
object[] errors;
|
||||
return ExecuteShellCommand(runSpace, cmd, useDomainController, out errors);
|
||||
}
|
||||
|
||||
internal Collection<PSObject> ExecuteShellCommand(Runspace runSpace, Command cmd, out object[] errors)
|
||||
{
|
||||
return ExecuteShellCommand(runSpace, cmd, true, out errors);
|
||||
}
|
||||
|
||||
internal Collection<PSObject> ExecuteShellCommand(Runspace runSpace, Command cmd, bool useDomainController, out object[] errors)
|
||||
{
|
||||
Log.WriteStart("ExecuteShellCommand");
|
||||
List<object> errorList = new List<object>();
|
||||
|
||||
if (useDomainController)
|
||||
{
|
||||
CommandParameter dc = new CommandParameter("DomainController", PrimaryDomainController);
|
||||
if (!cmd.Parameters.Contains(dc))
|
||||
{
|
||||
cmd.Parameters.Add(dc);
|
||||
}
|
||||
}
|
||||
|
||||
Collection<PSObject> results = null;
|
||||
// Create a pipeline
|
||||
Pipeline pipeLine = runSpace.CreatePipeline();
|
||||
using (pipeLine)
|
||||
{
|
||||
// Add the command
|
||||
pipeLine.Commands.Add(cmd);
|
||||
// Execute the pipeline and save the objects returned.
|
||||
results = pipeLine.Invoke();
|
||||
|
||||
// Log out any errors in the pipeline execution
|
||||
// NOTE: These errors are NOT thrown as exceptions!
|
||||
// Be sure to check this to ensure that no errors
|
||||
// happened while executing the command.
|
||||
if (pipeLine.Error != null && pipeLine.Error.Count > 0)
|
||||
{
|
||||
foreach (object item in pipeLine.Error.ReadToEnd())
|
||||
{
|
||||
errorList.Add(item);
|
||||
string errorMessage = string.Format("Invoke error: {0}", item);
|
||||
Log.WriteWarning(errorMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
pipeLine = null;
|
||||
errors = errorList.ToArray();
|
||||
Log.WriteEnd("ExecuteShellCommand");
|
||||
return results;
|
||||
}
|
||||
|
||||
internal object GetPSObjectProperty(PSObject obj, string name)
|
||||
{
|
||||
return obj.Members[name].Value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the identity of the object from the shell execution result
|
||||
/// </summary>
|
||||
/// <param name="result"></param>
|
||||
/// <returns></returns>
|
||||
internal string GetResultObjectIdentity(Collection<PSObject> result)
|
||||
{
|
||||
Log.WriteStart("GetResultObjectIdentity");
|
||||
if (result == null)
|
||||
throw new ArgumentNullException("result", "Execution result is not specified");
|
||||
|
||||
if (result.Count < 1)
|
||||
throw new ArgumentException("Execution result is empty", "result");
|
||||
|
||||
if (result.Count > 1)
|
||||
throw new ArgumentException("Execution result contains more than one object", "result");
|
||||
|
||||
PSMemberInfo info = result[0].Members["Identity"];
|
||||
if (info == null)
|
||||
throw new ArgumentException("Execution result does not contain Identity property", "result");
|
||||
|
||||
string ret = info.Value.ToString();
|
||||
Log.WriteEnd("GetResultObjectIdentity");
|
||||
return ret;
|
||||
}
|
||||
|
||||
internal string GetResultObjectDN(Collection<PSObject> result)
|
||||
{
|
||||
Log.WriteStart("GetResultObjectDN");
|
||||
if (result == null)
|
||||
throw new ArgumentNullException("result", "Execution result is not specified");
|
||||
|
||||
if (result.Count < 1)
|
||||
throw new ArgumentException("Execution result does not contain any object");
|
||||
|
||||
if (result.Count > 1)
|
||||
throw new ArgumentException("Execution result contains more than one object");
|
||||
|
||||
PSMemberInfo info = result[0].Members["DistinguishedName"];
|
||||
if (info == null)
|
||||
throw new ArgumentException("Execution result does not contain DistinguishedName property", "result");
|
||||
|
||||
string ret = info.Value.ToString();
|
||||
Log.WriteEnd("GetResultObjectDN");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue