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); }
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); }
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); } } }
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)); }
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); }