예제 #1
0
        public NTStatus SetFileInformation(object handle, FileInformation information)
        {
            SetInfoRequest request = new SetInfoRequest();

            request.InfoType             = InfoType.File;
            request.FileInformationClass = information.FileInformationClass;
            request.FileId = (FileID)handle;
            request.SetFileInformation(information);

            ulong       messageId = TrySendCommand(request);
            SMB2Command response  = m_client.WaitForCommand(SMB2CommandName.SetInfo, messageId);

            if (response != null)
            {
                return(response.Header.Status);
            }

            return(NTStatus.STATUS_INVALID_SMB);
        }
예제 #2
0
        public async Task <NTStatus> SetFileInformationAsync(object handle, FileInformation information, CancellationToken cancellationToken)
        {
            SetInfoRequest request = new SetInfoRequest();

            request.InfoType             = InfoType.File;
            request.FileInformationClass = information.FileInformationClass;
            request.FileId = (FileID)handle;
            request.SetFileInformation(information);

            await TrySendCommandAsync(request, cancellationToken);

            SMB2Command response = m_client.WaitForCommand(SMB2CommandName.SetInfo);

            if (response != null)
            {
                return(response.Header.Status);
            }

            return(NTStatus.STATUS_INVALID_SMB);
        }
예제 #3
0
        public async Task <SetInfoResult> SetInfoAsyncLite(
            string strRemoteUserName,
            SetInfoRequest request,
            TimeSpan timeout,
            CancellationToken token)
        {
            SetInfoResult result = new SetInfoResult();

            if (result.Entities == null)
            {
                result.Entities = new List <Entity>();
            }

            if (string.IsNullOrEmpty(request.TaskID) == true)
            {
                request.TaskID = Guid.NewGuid().ToString();
            }

            using (WaitEvents wait_events = new WaitEvents())
            {
                using (var handler = HubProxy.On <
                           string, long, IList <Entity>, string>(
                           "responseSetInfo",
                           (taskID, resultValue, entities, errorInfo) =>
                {
                    if (taskID != request.TaskID)
                    {
                        return;
                    }

                    // 装载命中结果
                    if (entities != null)
                    {
                        result.Entities.AddRange(entities);
                    }
                    result.Value = resultValue;
                    result.ErrorInfo = errorInfo;
                    wait_events.finish_event.Set();
                }))
                {
                    MessageResult message = await HubProxy.Invoke <MessageResult>(
                        "RequestSetInfo",
                        strRemoteUserName,
                        request).ConfigureAwait(false);

                    if (message.Value == -1 ||
                        message.Value == 0)
                    {
                        result.ErrorInfo = message.ErrorInfo;
                        result.Value     = -1;
                        result.String    = message.String;
                        return(result);
                    }

                    await WaitAsync(
                        request.TaskID,
                        wait_events,
                        timeout,
                        token).ConfigureAwait(false);

                    return(result);
                }
            }
        }
예제 #4
0
        internal static SMB2Command GetSetInfoResponse(SetInfoRequest request, ISMBShare share, SMB2ConnectionState state)
        {
            SMB2Session    session  = state.GetSession(request.Header.SessionID);
            OpenFileObject openFile = null;

            if (request.InfoType == InfoType.File || request.InfoType == InfoType.Security)
            {
                openFile = session.GetOpenFileObject(request.FileId);
                if (openFile == null)
                {
                    state.LogToServer(Severity.Verbose, "SetFileInformation failed. Invalid FileId. (SessionID: {0}, TreeID: {1}, FileId: {2})", request.Header.SessionID, request.Header.TreeID, request.FileId.Volatile);
                    return(new ErrorResponse(request.CommandName, NTStatus.STATUS_FILE_CLOSED));
                }

                if (share is FileSystemShare)
                {
                    if (!((FileSystemShare)share).HasWriteAccess(session.SecurityContext, openFile.Path))
                    {
                        state.LogToServer(Severity.Verbose, "SetFileInformation on '{0}{1}' failed. User '{2}' was denied access.", share.Name, openFile.Path, session.UserName);
                        return(new ErrorResponse(request.CommandName, NTStatus.STATUS_ACCESS_DENIED));
                    }
                }
            }
            else if (request.InfoType == InfoType.FileSystem)
            {
                if (share is FileSystemShare)
                {
                    if (!((FileSystemShare)share).HasWriteAccess(session.SecurityContext, @"\"))
                    {
                        state.LogToServer(Severity.Verbose, "SetFileSystemInformation on '{0}' failed. User '{1}' was denied access.", share.Name, session.UserName);
                        return(new ErrorResponse(request.CommandName, NTStatus.STATUS_ACCESS_DENIED));
                    }
                }
            }

            if (request.InfoType == InfoType.File)
            {
                FileInformation information;
                try
                {
                    information = FileInformation.GetFileInformation(request.Buffer, 0, request.FileInformationClass);
                }
                catch (UnsupportedInformationLevelException)
                {
                    state.LogToServer(Severity.Verbose, "SetFileInformation on '{0}{1}' failed. Information class: {2}, NTStatus: STATUS_INVALID_INFO_CLASS.", share.Name, openFile.Path, request.FileInformationClass);
                    return(new ErrorResponse(request.CommandName, NTStatus.STATUS_INVALID_INFO_CLASS));
                }
                catch (NotImplementedException)
                {
                    state.LogToServer(Severity.Verbose, "SetFileInformation on '{0}{1}' failed. Information class: {2}, NTStatus: STATUS_NOT_SUPPORTED.", share.Name, openFile.Path, request.FileInformationClass);
                    return(new ErrorResponse(request.CommandName, NTStatus.STATUS_NOT_SUPPORTED));
                }
                catch (Exception)
                {
                    state.LogToServer(Severity.Verbose, "SetFileInformation on '{0}{1}' failed. Information class: {2}, NTStatus: STATUS_INVALID_PARAMETER.", share.Name, openFile.Path, request.FileInformationClass);
                    return(new ErrorResponse(request.CommandName, NTStatus.STATUS_INVALID_PARAMETER));
                }

                if ((share is FileSystemShare) && (information is FileRenameInformationType2))
                {
                    string newFileName = ((FileRenameInformationType2)information).FileName;
                    if (!newFileName.StartsWith(@"\"))
                    {
                        newFileName = @"\" + newFileName;
                    }
                    if (!((FileSystemShare)share).HasWriteAccess(session.SecurityContext, newFileName))
                    {
                        state.LogToServer(Severity.Verbose, "SetFileInformation: Rename '{0}{1}' to '{0}{2}' failed. User '{3}' was denied access.", share.Name, openFile.Path, newFileName, session.UserName);
                        return(new ErrorResponse(request.CommandName, NTStatus.STATUS_ACCESS_DENIED));
                    }
                }

                NTStatus status = share.FileStore.SetFileInformation(openFile.Handle, information);
                if (status != NTStatus.STATUS_SUCCESS)
                {
                    state.LogToServer(Severity.Verbose, "SetFileInformation on '{0}{1}' failed. Information class: {2}, NTStatus: {3}. (FileId: {4})", share.Name, openFile.Path, request.FileInformationClass, status, request.FileId.Volatile);
                    return(new ErrorResponse(request.CommandName, status));
                }

                if (information is FileRenameInformationType2)
                {
                    string newFileName = ((FileRenameInformationType2)information).FileName;
                    if (!newFileName.StartsWith(@"\"))
                    {
                        newFileName = @"\" + newFileName;
                    }
                    state.LogToServer(Severity.Verbose, "SetFileInformation: Rename '{0}{1}' to '{0}{2}' succeeded. (FileId: {3})", share.Name, openFile.Path, newFileName, request.FileId.Volatile);
                    openFile.Path = newFileName;
                }
                else
                {
                    state.LogToServer(Severity.Information, "SetFileInformation on '{0}{1}' succeeded. Information class: {2}. (FileId: {3})", share.Name, openFile.Path, request.FileInformationClass, request.FileId.Volatile);
                }
                return(new SetInfoResponse());
            }
            else if (request.InfoType == InfoType.FileSystem)
            {
                FileSystemInformation fileSystemInformation;
                try
                {
                    fileSystemInformation = FileSystemInformation.GetFileSystemInformation(request.Buffer, 0, request.FileSystemInformationClass);
                }
                catch (UnsupportedInformationLevelException)
                {
                    state.LogToServer(Severity.Verbose, "SetFileSystemInformation on '{0}' failed. Information class: {1}, NTStatus: STATUS_INVALID_INFO_CLASS.", share.Name, request.FileSystemInformationClass);
                    return(new ErrorResponse(request.CommandName, NTStatus.STATUS_INVALID_INFO_CLASS));
                }
                catch (Exception)
                {
                    state.LogToServer(Severity.Verbose, "SetFileSystemInformation on '{0}' failed. Information class: {1}, NTStatus: STATUS_INVALID_PARAMETER.", share.Name, request.FileSystemInformationClass);
                    return(new ErrorResponse(request.CommandName, NTStatus.STATUS_INVALID_PARAMETER));
                }

                NTStatus status = share.FileStore.SetFileSystemInformation(fileSystemInformation);
                if (status != NTStatus.STATUS_SUCCESS)
                {
                    state.LogToServer(Severity.Verbose, "SetFileSystemInformation on '{0}' failed. Information class: {1}, NTStatus: {2}.", share.Name, request.FileSystemInformationClass, status);
                    return(new ErrorResponse(request.CommandName, status));
                }

                state.LogToServer(Severity.Verbose, "SetFileSystemInformation on '{0}' succeeded. Information class: {1}.", share.Name, request.FileSystemInformationClass);
                return(new SetInfoResponse());
            }
            else if (request.InfoType == InfoType.Security)
            {
                SecurityDescriptor securityDescriptor;
                try
                {
                    securityDescriptor = new SecurityDescriptor(request.Buffer, 0);
                }
                catch
                {
                    state.LogToServer(Severity.Verbose, "SetSecurityInformation on '{0}{1}' failed. NTStatus: STATUS_INVALID_PARAMETER.", share.Name, openFile.Path);
                    return(new ErrorResponse(request.CommandName, NTStatus.STATUS_INVALID_PARAMETER));
                }

                NTStatus status = share.FileStore.SetSecurityInformation(openFile, request.SecurityInformation, securityDescriptor);
                if (status != NTStatus.STATUS_SUCCESS)
                {
                    state.LogToServer(Severity.Verbose, "SetSecurityInformation on '{0}{1}' failed. Security information: 0x{2}, NTStatus: {3}. (FileId: {4})", share.Name, openFile.Path, request.SecurityInformation.ToString("X"), status, request.FileId.Volatile);
                    return(new ErrorResponse(request.CommandName, status));
                }

                state.LogToServer(Severity.Information, "SetSecurityInformation on '{0}{1}' succeeded. Security information: 0x{2}. (FileId: {3})", share.Name, openFile.Path, request.SecurityInformation.ToString("X"), request.FileId.Volatile);
                return(new SetInfoResponse());
            }
            return(new ErrorResponse(request.CommandName, NTStatus.STATUS_NOT_SUPPORTED));
        }
예제 #5
0
        async void MenuItem_modifyState_Click(object sender, EventArgs e)
        {
            string strError = "";

            string new_state = InputDlg.GetInput(this, "修改状态", "新状态值", "dontsync", this.Font);

            if (new_state == null)
            {
                return;
            }
            try
            {
                SetInfoRequest request = new SetInfoRequest();
                request.Operation = "setHistory";
                request.Entities  = new List <Entity>();

                foreach (ListViewItem item in this.listView_records.SelectedItems)
                {
                    RequestItem tag = item.Tag as RequestItem;
                    tag.State = new_state;
                    Record record = new Record {
                        Data = JsonConvert.SerializeObject(tag)
                    };
                    request.Entities.Add(new Entity
                    {
                        Action    = "change:state",
                        NewRecord = record
                    });
                }

                var connection = await ConnectionPool.GetConnectionAsync(this.comboBox_query_myAccount.Text);

                var result = await connection.SetInfoAsyncLite(this.comboBox_query_shelfAccount.Text,
                                                               request,
                                                               TimeSpan.FromSeconds(10),
                                                               default);

                if (result.Value == -1)
                {
                    strError = result.ErrorInfo;
                    goto ERROR1;
                }

                // 报错
                List <string> errors          = new List <string>();
                List <string> succeed_records = new List <string>();
                if (result.Entities != null)
                {
                    foreach (var entity in result.Entities)
                    {
                        if (string.IsNullOrEmpty(entity.ErrorInfo) == false)
                        {
                            errors.Add(entity.ErrorInfo);
                        }
                        else
                        {
                            succeed_records.Add(entity.NewRecord?.Data);
                        }
                    }
                }

                // 刷新成功修改了的行
                foreach (var record in succeed_records)
                {
                    if (string.IsNullOrEmpty(record))
                    {
                        continue;
                    }
                    var item = JsonConvert.DeserializeObject <RequestItem>(record);
                    RefreshLine(item.ID, item);
                }

                if (errors.Count > 0)
                {
                    MessageDialog.Show(this, $"出错:\r\n{StringUtil.MakePathList(errors, "\r\n")}");
                }
                return;
            }
            catch (Exception ex)
            {
                strError = ex.Message;
                goto ERROR1;
            }

ERROR1:
            MessageBox.Show(this, strError);
        }