Exemple #1
0
        /// <summary>
        /// Method to create an object from a set of object attributes.
        /// </summary>
        /// <param name="obj_attributes">The object attributes to create/open from.</param>
        /// <returns>The newly created object.</returns>
        protected override object CreateObject(ObjectAttributes obj_attributes)
        {
            NtToken.EnableEffectivePrivilege(TokenPrivilegeValue.SeCreateSymbolicLinkPrivilege);
            Options |= FileOpenOptions.OpenReparsePoint;

            if (ParameterSetName != "ReparseBuffer")
            {
                string target_path = Relative ? TargetPath : ResolvePath(SessionState, TargetPath, Win32Path);
                switch (ParameterSetName)
                {
                case "MountPoint":
                    Directory     = true;
                    ReparseBuffer = new MountPointReparseBuffer(target_path, PrintName);
                    break;

                case "Symlink":
                    ReparseBuffer = new SymlinkReparseBuffer(target_path, string.IsNullOrEmpty(PrintName)
                            ? target_path : PrintName, Relative ? SymlinkReparseBufferFlags.Relative : SymlinkReparseBufferFlags.None);
                    break;

                case "RawBytes":
                    ReparseBuffer = ReparseBuffer.FromByteArray(Bytes);
                    break;
                }
            }

            using (NtFile file = (NtFile)base.CreateObject(obj_attributes))
            {
                if (Flags != ReparseBufferExFlags.None || ExistingTag != 0 || ExistingGuid != Guid.Empty)
                {
                    file.SetReparsePointEx(ReparseBuffer, Flags, ExistingTag, ExistingGuid);
                }
                else
                {
                    file.SetReparsePoint(ReparseBuffer);
                }
            }

            return(null);
        }