private void ParseSddl(string sddlForm)
        {
            ControlFlags flags = ControlFlags.None;

            int pos = 0;

            while (pos < sddlForm.Length - 2)
            {
                switch (sddlForm.Substring(pos, 2))
                {
                case "O:":
                    pos  += 2;
                    Owner = SecurityIdentifier.ParseSddlForm(sddlForm, ref pos);
                    break;

                case "G:":
                    pos  += 2;
                    Group = SecurityIdentifier.ParseSddlForm(sddlForm, ref pos);
                    break;

                case "D:":
                    pos += 2;
                    DiscretionaryAcl = RawAcl.ParseSddlForm(sddlForm, true, ref flags, ref pos);
                    flags           |= ControlFlags.DiscretionaryAclPresent;
                    break;

                case "S:":
                    pos      += 2;
                    SystemAcl = RawAcl.ParseSddlForm(sddlForm, false, ref flags, ref pos);
                    flags    |= ControlFlags.SystemAclPresent;
                    break;

                default:

                    throw new ArgumentException("Invalid SDDL.", "sddlForm");
                }
            }

            if (pos != sddlForm.Length)
            {
                throw new ArgumentException("Invalid SDDL.", "sddlForm");
            }

            SetFlags(flags);
        }