|
- using Alphaleonis.Win32.Filesystem;
- using Security2;
- using System;
- using System.Management.Automation;
- using Security2.FileSystem.FileInfo;
-
- namespace NTFSSecurity
- {
- [Cmdlet(VerbsCommon.Get, "FileHash2")]
- [OutputType(typeof(FileSystemAccessRule2))]
- public class GetFileHash2 : BaseCmdlet
- {
- private HashAlgorithms algorithm = HashAlgorithms.SHA256;
-
- [Parameter(Mandatory = true, Position = 1, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
- [ValidateNotNullOrEmpty]
- [Alias("FullName")]
- public string[] Path
- {
- get { return paths.ToArray(); }
- set
- {
- paths.Clear();
- paths.AddRange(value);
- }
- }
-
- [Parameter(Position = 2, ValueFromPipelineByPropertyName = true)]
- public HashAlgorithms Algorithm
- {
- get { return algorithm; }
- set { algorithm = value; }
- }
-
- protected override void BeginProcessing()
- {
- base.BeginProcessing();
- }
-
- protected override void ProcessRecord()
- {
- string hash = string.Empty;
- FileSystemInfo item = null;
-
- foreach (var path in paths)
- {
- try
- {
- item = GetFileSystemInfo2(path) as FileInfo;
- if (item == null)
- return;
- }
- catch (Exception ex)
- {
- WriteError(new ErrorRecord(ex, "ReadFileError", ErrorCategory.OpenError, path));
- continue;
- }
-
- try
- {
- hash = ((FileInfo)item).GetHash(algorithm);
- }
- catch (UnauthorizedAccessException)
- {
- try
- {
- var ownerInfo = FileSystemOwner.GetOwner(item);
- var previousOwner = ownerInfo.Owner;
-
- FileSystemOwner.SetOwner(item, System.Security.Principal.WindowsIdentity.GetCurrent().User);
-
- hash = ((FileInfo)item).GetHash(algorithm);
-
- FileSystemOwner.SetOwner(item, previousOwner);
- }
- catch (Exception ex2)
- {
- WriteError(new ErrorRecord(ex2, "GetHashError", ErrorCategory.WriteError, path));
- }
- }
- catch (Exception ex)
- {
- WriteError(new ErrorRecord(ex, "GetHashError", ErrorCategory.WriteError, path));
- }
-
- var result = new PSObject(item);
- result.Properties.Add(new PSNoteProperty("Hash", hash));
- result.Properties.Add(new PSNoteProperty("Algorithm", algorithm.ToString()));
- result.TypeNames.Insert(0, "Alphaleonis.Win32.Filesystem.FileInfo+Hash");
- WriteObject(result);
- }
- }
-
- protected override void EndProcessing()
- {
- base.EndProcessing();
- }
- }
- }
|