public void Create() { FileShareWitnessCheckResult fileShareWitnessCheckResult = this.Check(); if (fileShareWitnessCheckResult != FileShareWitnessCheckResult.FswOK) { FileSystemSecurity fileSystemSecurity = new DirectorySecurity(); foreach (FileSystemAccessRule rule in this.AccessRules) { fileSystemSecurity.AddAccessRule(rule); } switch (fileShareWitnessCheckResult) { case FileShareWitnessCheckResult.FswDoesNotExist: try { TaskLogger.Trace("Attempting to create new witness share \\\\{0}\\{1}.", new object[] { this.WitnessServer, this.ShareName }); WmiWrapper.CreateDirectory(this.WitnessServerFqdn, this.WitnessDirectory.ToString()); int num; NetShare.AddShare(string.Format(FileShareWitness.s_hostNameFormat, this.WitnessServerFqdn), null, this.ShareName, this.WitnessDirectory.ToString(), this.m_shareRemark, fileSystemSecurity.GetSecurityDescriptorBinaryForm(), out num); this.m_existingShareRemark = this.m_shareRemark; this.m_shareType = 0U; this.m_sharePermissions = 1; this.m_shareMaxUses = -1; this.m_existingWitnessDirectory = this.WitnessDirectory; this.m_existingSecurity = fileSystemSecurity; this.m_exists = new bool?(true); this.m_isJustCreated = true; TaskLogger.Trace("Attempt to create new witness share \\\\{0}\\{1} succeeded.", new object[] { this.WitnessServer, this.ShareName }); return; } catch (WmiException ex) { throw new DagFswUnableToCreateWitnessDirectoryException(this.WitnessServerFqdn, this.WitnessDirectory.ToString(), ex); } catch (Win32Exception ex2) { throw new DagFswUnableToCreateWitnessShareException(this.WitnessServerFqdn, this.FileShareWitnessShare.ToString(), ex2); } break; case FileShareWitnessCheckResult.FswWrongDirectory: goto IL_1C1; case FileShareWitnessCheckResult.FswWrongPermissions: break; default: return; } fileSystemSecurity = this.m_existingSecurity; foreach (FileSystemAccessRule rule2 in this.AccessRules) { fileSystemSecurity.AddAccessRule(rule2); } try { IL_1C1: TaskLogger.Trace("Attempting to modify permissions on witness share \\\\{0}\\{1}.", new object[] { this.WitnessServer, this.ShareName }); NetShare.SetShareInfo(this.WitnessServerFqdn, this.ShareName, this.WitnessDirectory.ToString(), this.m_shareRemark, this.m_shareType, this.m_sharePermissions, -1, fileSystemSecurity.GetSecurityDescriptorBinaryForm()); this.m_existingWitnessDirectory = this.WitnessDirectory; this.m_existingSecurity = fileSystemSecurity; this.m_shareMaxUses = -1; this.m_exists = new bool?(true); TaskLogger.Trace("Attempt to modify permissions on witness share \\\\{0}\\{1} succeeded.", new object[] { this.WitnessServer, this.ShareName }); } catch (Win32Exception ex3) { throw new DagFswUnableToUpdateWitnessShareException(this.WitnessServerFqdn, this.FileShareWitnessShare.ToString(), ex3); } } }
public static bool TryCreateDirectory(string serverFQDN, string directoryPath, FileSystemAccessRule[] directoryPermissions, Task.TaskVerboseLoggingDelegate verboseDelegate, Task.TaskWarningLoggingDelegate warningDelegate) { bool flag = false; if (string.Compare(serverFQDN, NativeHelpers.GetLocalComputerFqdn(false), StringComparison.InvariantCultureIgnoreCase) == 0) { try { verboseDelegate(Strings.VerboseCheckDirectoryExistenceCondition(serverFQDN, directoryPath)); if (Directory.Exists(directoryPath)) { if (directoryPermissions != null) { DirectorySecurity directorySecurity = SystemConfigurationTasksHelper.CreateDirectorySecurityHelper(directoryPermissions); directorySecurity.SetAccessRuleProtection(true, false); verboseDelegate(Strings.VerboseSetAccessControl(serverFQDN, directoryPath)); TaskLogger.Trace("Directory \"" + directoryPath + "\" already exists on the local machine, just set the access control.", new object[0]); Directory.SetAccessControl(directoryPath, directorySecurity); flag = true; } else { verboseDelegate(Strings.VerboseNoAccessControlSpecified(serverFQDN, directoryPath)); TaskLogger.Trace("No access control specified to be set on directory \"" + directoryPath + "\".", new object[0]); flag = true; } } else if (directoryPermissions != null) { DirectorySecurity directorySecurity = SystemConfigurationTasksHelper.CreateDirectorySecurityHelper(directoryPermissions); directorySecurity.SetAccessRuleProtection(true, false); verboseDelegate(Strings.VerboseCreateDirectory(serverFQDN, directoryPath)); TaskLogger.Trace("Directory \"" + directoryPath + "\" does not exist. Create the directory on the local machine and set the access control.", new object[0]); Directory.CreateDirectory(directoryPath, directorySecurity); flag = true; } else { verboseDelegate(Strings.VerboseCreateDirectory(serverFQDN, directoryPath)); verboseDelegate(Strings.VerboseNoAccessControlSpecified(serverFQDN, directoryPath)); TaskLogger.Trace("Directory \"" + directoryPath + "\" does not exist. Create the directory on the local machine. No access controls specified to set on the directory.", new object[0]); Directory.CreateDirectory(directoryPath); flag = true; } goto IL_43C; } catch (NotSupportedException ex) { verboseDelegate(Strings.VerboseFailedCreateDirectory(serverFQDN, directoryPath, ex.Message)); TaskLogger.Trace("this.TryCreateDirectory() raised exception: {0}", new object[] { ex.ToString() }); goto IL_43C; } catch (ArgumentNullException ex2) { verboseDelegate(Strings.VerboseFailedCreateDirectory(serverFQDN, directoryPath, ex2.Message)); TaskLogger.Trace("this.TryCreateDirectory() raised exception: {0}", new object[] { ex2.ToString() }); goto IL_43C; } catch (UnauthorizedAccessException ex3) { verboseDelegate(Strings.VerboseFailedCreateDirectory(serverFQDN, directoryPath, ex3.Message)); TaskLogger.Trace("this.TryCreateDirectory() raised exception: {0}", new object[] { ex3.ToString() }); goto IL_43C; } catch (ArgumentException ex4) { verboseDelegate(Strings.VerboseFailedCreateDirectory(serverFQDN, directoryPath, ex4.Message)); TaskLogger.Trace("this.TryCreateDirectory() raised exception: {0}", new object[] { ex4.ToString() }); goto IL_43C; } catch (IOException ex5) { verboseDelegate(Strings.VerboseFailedCreateDirectory(serverFQDN, directoryPath, ex5.Message)); TaskLogger.Trace("this.TryCreateDirectory() raised exception: {0}", new object[] { ex5.ToString() }); goto IL_43C; } } try { verboseDelegate(Strings.VerboseCheckDirectoryExistenceCondition(serverFQDN, directoryPath)); uint num; if (!WmiWrapper.IsDirectoryExisting(serverFQDN, directoryPath)) { verboseDelegate(Strings.VerboseCreateDirectory(serverFQDN, directoryPath)); TaskLogger.Trace(string.Concat(new string[] { "Create the directory \"", directoryPath, "\" on the remote machine \"", serverFQDN, "\"." }), new object[0]); num = WmiWrapper.CreateDirectory(serverFQDN, directoryPath); } else { num = 0U; } if (num == 0U) { if (directoryPermissions != null) { verboseDelegate(Strings.VerboseSetAccessControl(serverFQDN, directoryPath)); TaskLogger.Trace(string.Concat(new string[] { "Set the access control for directory \"", directoryPath, "\" on the remote machine \"", serverFQDN, "\"." }), new object[0]); num = WmiWrapper.ChangeSecurityPermissions(serverFQDN, directoryPath, directoryPermissions); if (num == 0U) { flag = true; } else { verboseDelegate(Strings.VerboseFailedSetAccessControl(serverFQDN, directoryPath, "WMI Status: " + num.ToString())); TaskLogger.Trace("this.TryCreateDirectory() failed to set the access control on the directory - WMI Status: {0}", new object[] { num.ToString() }); } } else { verboseDelegate(Strings.VerboseNoAccessControlSpecified(serverFQDN, directoryPath)); TaskLogger.Trace("No access control specified to be set on directory \"" + directoryPath + "\".", new object[0]); flag = true; } } else { verboseDelegate(Strings.VerboseFailedCreateDirectory(serverFQDN, directoryPath, "WMI Status: " + num.ToString())); TaskLogger.Trace("this.TryCreateDirectory() failed to create the directory - WMI Status: {0}", new object[] { num.ToString() }); } } catch (WmiException ex6) { verboseDelegate(Strings.VerboseFailedCreateDirectory(serverFQDN, directoryPath, ex6.Message)); TaskLogger.Trace("this.TryCreateDirectory() raised exception: {0}", new object[] { ex6.ToString() }); } catch (UnauthorizedAccessException ex7) { verboseDelegate(Strings.ErrorFailedToConnectToServer(serverFQDN, ex7.Message)); TaskLogger.Trace("this.TryCreateDirectory() raised exception: {0}", new object[] { ex7.ToString() }); } IL_43C: if (!flag) { warningDelegate(Strings.WarningFailedCreateDirectory(serverFQDN, directoryPath)); } return(flag); }