Пример #1
0
        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);
        }