/// <summary> /// Tentar fechar o ponteiro do processo que está usando o item /// </summary> /// <param name="item">Item</param> /// <returns>null em caso de sucesso; string de erro caso contrário</returns> public string CloseHandle(HandleProcessItem item) { string args = $"-c {item.Address} -p {item.Pid} -y -nobanner"; string output, outputerror; int resultado = CommandClass.ExecuteCommand(Constantes.HandlePath, args, out output, out outputerror, Path.GetDirectoryName(Constantes.HandlePath)); if (resultado == 0) { int index = output.IndexOf(PatternErrorClosingHandle, StringComparison.CurrentCultureIgnoreCase); if (index >= 0) { string msg = output.Substring(index + PatternErrorClosingHandle.Length).Trim(); if ((msg.IndexOf(IdentificadorInvalido, StringComparison.CurrentCultureIgnoreCase) >= 0) || (msg.IndexOf(InvalidIdentifier, StringComparison.CurrentCultureIgnoreCase) >= 0)) { msg += Environment.NewLine + "Tente executar com privilégios de administrador."; } return(msg); } } else { return(output + " " + outputerror); } return(null); }
/// <summary> /// Criar uma instância da classe <see cref="HandleProcessItem"/> /// </summary> /// <param name="outputLine">Representa uma linha do output contendo as informações a serem extraídas</param> /// <returns>Instância da classe <see cref="HandleProcessItem"/></returns> public static HandleProcessItem Parse(string outputLine) { if (string.IsNullOrWhiteSpace(outputLine)) { throw new ArgumentNullException(nameof(outputLine)); } HandleProcessItem item = new HandleProcessItem() { ProcessName = outputLine }; if (outputLine.Contains("pid")) { MatchCollection matches = _regexOutput.Matches(outputLine); if (matches.Count > 0) { int pid; if (int.TryParse(matches[0].Groups[2].Value, out pid)) { item.Pid = pid; } item.ProcessName = matches[0].Groups[1].Value; item.HandleType = matches[0].Groups[3].Value; item.User = matches[0].Groups[4].Value; item.Address = matches[0].Groups[5].Value; item.HandlePath = matches[0].Groups[6].Value; } } return(item); }
/// <summary> /// Lê o output do handle e devolve uma lista de objetos representando o uso /// </summary> /// <param name="output">Output</param> /// <returns>lista de objetos representando o uso</returns> public static List <HandleProcessItem> ParseOutput(string output) { string[] splited = output.Split(new string[] { "\r\r", "\n", "\r" }, StringSplitOptions.RemoveEmptyEntries); var lst = new List <HandleProcessItem>(); foreach (string estaLinha in splited) { HandleProcessItem item = Parse(estaLinha); lst.Add(item); } return(lst); }
/// <summary> /// Verificar se o item está sendo usado por algum processo /// </summary> /// <param name="item">Item a ser verificado. Pode ser uma pasta ou um arquivo</param> /// <returns>Lista de uso; lista vazia se o item não está em uso</returns> /// <exception cref="Exception">Erro ao verficar uso do item</exception> public List <HandleProcessItem> GetHandles(string item) { string output, outputError; int exitCode = CommandClass.ExecuteCommand(FileName, "-a -u -accepteula -nobanner \"" + item + "\"", out output, out outputError, Path.GetDirectoryName(FileName)); if (exitCode == 0) { if (output.IndexOf(PatternNoMatchingFound, StringComparison.CurrentCultureIgnoreCase) >= 0) { return(new List <HandleProcessItem>()); } else { List <HandleProcessItem> lstProcessos = HandleProcessItem.ParseOutput(output); return(lstProcessos); } } else { throw new Exception(outputError); } }