private static bool TryEnableProjFSOptionalFeature(ITracer tracer, PhysicalFileSystem fileSystem) { EventMetadata metadata = CreateEventMetadata(); const int ProjFSNotAnOptionalFeature = 2; const int ProjFSEnabled = 3; const int ProjFSDisabled = 4; ProcessResult getOptionalFeatureResult = CallPowershellCommand( "$var=(Get-WindowsOptionalFeature -Online -FeatureName " + OptionalFeatureName + "); if($var -eq $null){exit " + ProjFSNotAnOptionalFeature + "}else{if($var.State -eq 'Enabled'){exit " + ProjFSEnabled + "}else{exit " + ProjFSDisabled + "}}"); bool projFSEnabled = false; switch (getOptionalFeatureResult.ExitCode) { case ProjFSNotAnOptionalFeature: tracer.RelatedError($"{nameof(TryEnableProjFSOptionalFeature)}: {OptionalFeatureName} optional feature is missing"); break; case ProjFSEnabled: tracer.RelatedEvent( EventLevel.Informational, $"{nameof(TryEnableProjFSOptionalFeature)}_ClientProjFSAlreadyEnabled", metadata, Keywords.Network); projFSEnabled = true; break; case ProjFSDisabled: ProcessResult enableOptionalFeatureResult = CallPowershellCommand("try {Enable-WindowsOptionalFeature -Online -FeatureName " + OptionalFeatureName + " -NoRestart}catch{exit 1}"); if (enableOptionalFeatureResult.ExitCode == 0) { metadata.Add(TracingConstants.MessageKey.InfoMessage, "Enabled ProjFS optional feature"); tracer.RelatedEvent(EventLevel.Informational, $"{nameof(TryEnableProjFSOptionalFeature)}_ClientProjFSDisabled", metadata); projFSEnabled = true; break; } metadata.Add("enableOptionalFeatureResult.ExitCode", enableOptionalFeatureResult.ExitCode); metadata.Add("enableOptionalFeatureResult.Output", enableOptionalFeatureResult.Output); metadata.Add("enableOptionalFeatureResult.Errors", enableOptionalFeatureResult.Errors); tracer.RelatedError(metadata, $"{nameof(TryEnableProjFSOptionalFeature)}: Failed to enable optional feature"); break; default: metadata.Add("getOptionalFeatureResult.ExitCode", getOptionalFeatureResult.ExitCode); metadata.Add("getOptionalFeatureResult.Output", getOptionalFeatureResult.Output); metadata.Add("getOptionalFeatureResult.Errors", getOptionalFeatureResult.Errors); tracer.RelatedError(metadata, $"{nameof(TryEnableProjFSOptionalFeature)}: Unexpected result"); break; } if (projFSEnabled) { if (IsNativeLibInstalled(tracer, fileSystem)) { return(true); } tracer.RelatedError($"{nameof(TryEnableProjFSOptionalFeature)}: {OptionalFeatureName} enabled, but native ProjFS library is not on path"); } return(false); }
/// <summary> /// Attempts to delete a file /// </summary> /// <param name="fileSystem">PhysicalFileSystem</param> /// <param name="path">Path of file to delete</param> /// <returns>True if the delete succeed, and false otherwise</returns> /// <remarks>The files attributes will be set to Normal before deleting the file</remarks> public static bool TryDeleteFile(this PhysicalFileSystem fileSystem, string path) { Exception exception; return(TryDeleteFile(fileSystem, path, out exception)); }
private static bool TryCopyNativeLibToAppDirectory(ITracer tracer, PhysicalFileSystem fileSystem, string gvfsAppDirectory) { string installFilePath; string appFilePath; GetNativeLibPaths(gvfsAppDirectory, out installFilePath, out appFilePath); EventMetadata pathMetadata = CreateEventMetadata(); pathMetadata.Add(nameof(gvfsAppDirectory), gvfsAppDirectory); pathMetadata.Add(nameof(installFilePath), installFilePath); pathMetadata.Add(nameof(appFilePath), appFilePath); if (fileSystem.FileExists(installFilePath)) { tracer.RelatedEvent(EventLevel.Informational, $"{nameof(TryCopyNativeLibToAppDirectory)}_CopyingNativeLib", pathMetadata); try { fileSystem.CopyFile(installFilePath, appFilePath, overwrite: true); try { Common.NativeMethods.FlushFileBuffers(appFilePath); } catch (Win32Exception e) { EventMetadata metadata = CreateEventMetadata(e); metadata.Add(nameof(appFilePath), appFilePath); metadata.Add(nameof(installFilePath), installFilePath); tracer.RelatedWarning(metadata, $"{nameof(TryCopyNativeLibToAppDirectory)}: Win32Exception while trying to flush file buffers", Keywords.Telemetry); } } catch (UnauthorizedAccessException e) { EventMetadata metadata = CreateEventMetadata(e); tracer.RelatedError(metadata, $"{nameof(TryCopyNativeLibToAppDirectory)}: UnauthorizedAccessException caught while trying to copy native lib"); return(false); } catch (DirectoryNotFoundException e) { EventMetadata metadata = CreateEventMetadata(e); tracer.RelatedError(metadata, $"{nameof(TryCopyNativeLibToAppDirectory)}: DirectoryNotFoundException caught while trying to copy native lib"); return(false); } catch (FileNotFoundException e) { EventMetadata metadata = CreateEventMetadata(e); tracer.RelatedError(metadata, $"{nameof(TryCopyNativeLibToAppDirectory)}: FileNotFoundException caught while trying to copy native lib"); return(false); } catch (IOException e) { EventMetadata metadata = CreateEventMetadata(e); tracer.RelatedWarning(metadata, $"{nameof(TryCopyNativeLibToAppDirectory)}: IOException caught while trying to copy native lib"); if (fileSystem.FileExists(appFilePath)) { tracer.RelatedWarning( CreateEventMetadata(), "Could not copy native lib to app directory, but file already exists, continuing with install", Keywords.Telemetry); } else { tracer.RelatedError($"{nameof(TryCopyNativeLibToAppDirectory)}: Failed to copy native lib to app directory"); return(false); } } } else { tracer.RelatedError(pathMetadata, $"{nameof(TryCopyNativeLibToAppDirectory)}: Native lib does not exist in install directory"); return(false); } return(true); }