Removes PowerShell module into its own repo
This commit is contained in:
@@ -1,24 +0,0 @@
|
|||||||
using System.IO;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Runtime.Loader;
|
|
||||||
|
|
||||||
namespace Lithnet.CredentialProvider.RegistrationTool
|
|
||||||
{
|
|
||||||
internal static class AssemblyContextResourceLoader
|
|
||||||
{
|
|
||||||
private static readonly DependencyAssemblyLoadContext dependencyLoadContext = new DependencyAssemblyLoadContext();
|
|
||||||
|
|
||||||
public static Assembly LoadIntoAlc(Stream stream)
|
|
||||||
{
|
|
||||||
return dependencyLoadContext.LoadFromStream(stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
private class DependencyAssemblyLoadContext : AssemblyLoadContext
|
|
||||||
{
|
|
||||||
protected override Assembly Load(AssemblyName assemblyName)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
using System;
|
|
||||||
|
|
||||||
namespace Lithnet.CredentialProvider.RegistrationTool
|
|
||||||
{
|
|
||||||
public class CredentialProviderRegistrationData
|
|
||||||
{
|
|
||||||
public bool IsComRegistered { get; set; }
|
|
||||||
|
|
||||||
public bool IsCredentialProviderRegistered { get; set; }
|
|
||||||
|
|
||||||
public bool IsCredentalProviderEnabled { get; set; }
|
|
||||||
|
|
||||||
public string CredentialProviderName { get; set; }
|
|
||||||
|
|
||||||
public Guid Clsid { get; set; }
|
|
||||||
|
|
||||||
public string ProgId { get; set; }
|
|
||||||
|
|
||||||
public string DllPath { get; set; }
|
|
||||||
|
|
||||||
public DllType DllType { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,443 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Reflection.Metadata;
|
|
||||||
using System.Reflection.PortableExecutable;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using Microsoft.Win32;
|
|
||||||
|
|
||||||
namespace Lithnet.CredentialProvider.RegistrationTool
|
|
||||||
{
|
|
||||||
public static class CredentialProviderRegistrationServices
|
|
||||||
{
|
|
||||||
public static bool IsManagedAssembly(string path)
|
|
||||||
{
|
|
||||||
using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
|
||||||
{
|
|
||||||
using (var peReader = new PEReader(fs))
|
|
||||||
{
|
|
||||||
if (!peReader.HasMetadata)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
MetadataReader reader = peReader.GetMetadataReader();
|
|
||||||
return reader.IsAssembly;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IEnumerable<CredentialProviderRegistrationData> GetCredentalProviders()
|
|
||||||
{
|
|
||||||
var cpKeys = Registry.LocalMachine.OpenSubKey($@"Software\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers");
|
|
||||||
foreach (var clsid in cpKeys.GetSubKeyNames())
|
|
||||||
{
|
|
||||||
if (Guid.TryParse(clsid, out Guid result))
|
|
||||||
{
|
|
||||||
yield return GetCredentialProvider(result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static CredentialProviderRegistrationData GetCredentialProvider(Type type)
|
|
||||||
{
|
|
||||||
var comGuid = GetComGuid(type);
|
|
||||||
return GetCredentialProvider(comGuid);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static CredentialProviderRegistrationData GetCredentialProvider(string progId)
|
|
||||||
{
|
|
||||||
var clsid = GetClsidFromProgId(progId);
|
|
||||||
return GetCredentialProvider(clsid);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static CredentialProviderRegistrationData GetCredentialProvider(Guid clsid)
|
|
||||||
{
|
|
||||||
CredentialProviderRegistrationData data = new CredentialProviderRegistrationData();
|
|
||||||
|
|
||||||
data.Clsid = clsid;
|
|
||||||
|
|
||||||
var clsidKey = Registry.ClassesRoot.OpenSubKey($@"CLSID\{clsid:B}");
|
|
||||||
if (clsidKey != null)
|
|
||||||
{
|
|
||||||
var inprocKey = clsidKey.OpenSubKey("InprocServer32");
|
|
||||||
data.IsComRegistered = inprocKey != null;
|
|
||||||
|
|
||||||
if (data.IsComRegistered)
|
|
||||||
{
|
|
||||||
var coreLib = inprocKey.GetValue(string.Empty) as string;
|
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(coreLib))
|
|
||||||
{
|
|
||||||
data.IsComRegistered = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (string.Equals(coreLib, "mscoree.dll", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
data.DllType = DllType.NetFramework;
|
|
||||||
data.DllPath = inprocKey.GetValue("CodeBase") as string;
|
|
||||||
}
|
|
||||||
else if (coreLib.EndsWith(".comhost.dll", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
data.DllType = DllType.NetCore;
|
|
||||||
var i = coreLib.IndexOf(".comhost.dll", StringComparison.OrdinalIgnoreCase);
|
|
||||||
data.DllPath = coreLib.Substring(0, i) + ".dll";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
data.DllType = DllType.Native;
|
|
||||||
data.DllPath = coreLib;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
data.ProgId = Registry.ClassesRoot.OpenSubKey($@"CLSID\{clsid:B}\ProgId")?.GetValue(string.Empty) as string;
|
|
||||||
|
|
||||||
var cpkey = Registry.LocalMachine.OpenSubKey($@"Software\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers\{clsid:B}");
|
|
||||||
data.IsCredentialProviderRegistered = cpkey != null;
|
|
||||||
|
|
||||||
if (data.IsCredentialProviderRegistered)
|
|
||||||
{
|
|
||||||
int? disabled = cpkey.GetValue("Disabled", 0) as int?;
|
|
||||||
data.IsCredentalProviderEnabled = disabled == null || disabled == 0;
|
|
||||||
data.CredentialProviderName = cpkey.GetValue(string.Empty) as string;
|
|
||||||
}
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void UnregisterCredentialProvider(Type type, bool unregisterCom)
|
|
||||||
{
|
|
||||||
DeleteCredentialProviderRegistration(type);
|
|
||||||
|
|
||||||
if (unregisterCom)
|
|
||||||
{
|
|
||||||
if (IsFrameworkType(type))
|
|
||||||
{
|
|
||||||
UnregisterFrameworkAssembly(type);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UnregisterNetCoreAssembly(type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void UnregisterCredentialProvider(Guid clsid, bool unregisterCom)
|
|
||||||
{
|
|
||||||
DeleteCredentialProviderRegistration(clsid);
|
|
||||||
|
|
||||||
if (unregisterCom)
|
|
||||||
{
|
|
||||||
UnregisterClass(clsid);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void RegisterCredentialProvider(Type type)
|
|
||||||
{
|
|
||||||
CreateCredentialProviderRegistration(type);
|
|
||||||
|
|
||||||
if (IsFrameworkType(type))
|
|
||||||
{
|
|
||||||
RegisterFrameworkAssembly(type);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
RegisterNetCoreAssembly(type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void DisableCredentialProvider(Type type)
|
|
||||||
{
|
|
||||||
var comGuid = GetComGuid(type);
|
|
||||||
DisableCredentialProvider(comGuid);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void DisableCredentialProvider(Guid comGuid)
|
|
||||||
{
|
|
||||||
var key = Registry.LocalMachine.OpenSubKey($@"SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers\{comGuid:B}", true);
|
|
||||||
key?.SetValue("Disabled", 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void EnableCredentialProvider(string progId)
|
|
||||||
{
|
|
||||||
var clsid = GetClsidFromProgId(progId);
|
|
||||||
EnableCredentialProvider(clsid);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void DisableCredentialProvider(string progId)
|
|
||||||
{
|
|
||||||
var clsid = GetClsidFromProgId(progId);
|
|
||||||
DisableCredentialProvider(clsid);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void EnableCredentialProvider(Guid comGuid)
|
|
||||||
{
|
|
||||||
var key = Registry.LocalMachine.OpenSubKey($@"SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers\{comGuid:B}", true);
|
|
||||||
key?.SetValue("Disabled", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void EnableCredentialProvider(Type type)
|
|
||||||
{
|
|
||||||
var comGuid = GetComGuid(type);
|
|
||||||
EnableCredentialProvider(comGuid);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void CreateCredentialProviderRegistration(Type t)
|
|
||||||
{
|
|
||||||
var comGuid = GetComGuid(t);
|
|
||||||
var typeName = GetTypeFullName(t);
|
|
||||||
|
|
||||||
var key = Registry.LocalMachine.CreateSubKey($@"SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers\{comGuid:B}", true);
|
|
||||||
key.SetValue(null, typeName);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void DeleteCredentialProviderRegistration(Type t)
|
|
||||||
{
|
|
||||||
var comGuid = GetComGuid(t);
|
|
||||||
DeleteCredentialProviderRegistration(comGuid);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void DeleteCredentialProviderRegistration(Guid clsid)
|
|
||||||
{
|
|
||||||
Registry.LocalMachine.DeleteSubKeyTree($@"SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers\{clsid:B}", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void RegisterNetCoreAssembly(Type t)
|
|
||||||
{
|
|
||||||
var comGuid = GetComGuid(t);
|
|
||||||
var typeName = GetTypeFullName(t);
|
|
||||||
var progId = GetComProgId(t);
|
|
||||||
var assemblyLocation = GetTypeAssemblyLocation(t);
|
|
||||||
|
|
||||||
var dir = Path.GetDirectoryName(assemblyLocation);
|
|
||||||
var assemblyFile = Path.GetFileNameWithoutExtension(assemblyLocation);
|
|
||||||
var comHostLocation = Path.Combine(dir, assemblyFile + ".comhost.dll");
|
|
||||||
|
|
||||||
var rootClsid = Registry.LocalMachine.CreateSubKey($@"Software\Classes\CLSID\{comGuid:B}", true);
|
|
||||||
rootClsid.SetValue(null, "CoreCLR COMHost Server");
|
|
||||||
|
|
||||||
var inprocKey = rootClsid.CreateSubKey("InprocServer32", true);
|
|
||||||
inprocKey.SetValue(null, comHostLocation);
|
|
||||||
inprocKey.SetValue("ThreadingModel", "Both");
|
|
||||||
|
|
||||||
var progIdKey = rootClsid.CreateSubKey("ProgId", true);
|
|
||||||
progIdKey.SetValue(null, progId);
|
|
||||||
|
|
||||||
var progIdRoot = Registry.LocalMachine.CreateSubKey($@"Software\Classes\{progId}", true);
|
|
||||||
progIdRoot.SetValue(null, typeName);
|
|
||||||
var progIdSubKey = progIdRoot.CreateSubKey("CLSID");
|
|
||||||
progIdSubKey.SetValue(null, comGuid.ToString("B"));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void UnregisterNetCoreAssembly(Type t)
|
|
||||||
{
|
|
||||||
var comGuid = GetComGuid(t);
|
|
||||||
var progId = GetComProgId(t);
|
|
||||||
|
|
||||||
UnregisterClass(comGuid, progId);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void UnregisterClass(Guid? clsid, string progId)
|
|
||||||
{
|
|
||||||
if (clsid != null)
|
|
||||||
{
|
|
||||||
Registry.LocalMachine.DeleteSubKeyTree($@"Software\Classes\CLSID\{clsid}", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(progId))
|
|
||||||
{
|
|
||||||
Registry.LocalMachine.DeleteSubKeyTree($@"Software\Classes\{progId}", false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void RegisterFrameworkAssembly(Type t)
|
|
||||||
{
|
|
||||||
var comGuid = GetComGuid(t);
|
|
||||||
var typeName = GetTypeFullName(t);
|
|
||||||
var progId = GetComProgId(t);
|
|
||||||
|
|
||||||
var rootClsid = Registry.LocalMachine.CreateSubKey($@"Software\Classes\CLSID\{comGuid:B}", true);
|
|
||||||
rootClsid.SetValue(null, typeName);
|
|
||||||
|
|
||||||
rootClsid.CreateSubKey("Implemented Categories");
|
|
||||||
rootClsid.CreateSubKey(@"Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}");
|
|
||||||
|
|
||||||
var inprocKey = rootClsid.CreateSubKey("InprocServer32", true);
|
|
||||||
inprocKey.SetValue(null, "mscoree.dll");
|
|
||||||
inprocKey.SetValue("ThreadingModel", "Both");
|
|
||||||
inprocKey.SetValue("Class", typeName);
|
|
||||||
inprocKey.SetValue("RuntimeVersion", "v4.0.30319");
|
|
||||||
inprocKey.SetValue("Assembly", GetTypeAssemblyName(t));
|
|
||||||
inprocKey.SetValue("CodeBase", GetTypeAssemblyLocation(t));
|
|
||||||
|
|
||||||
var progIdKey = rootClsid.CreateSubKey("ProgId", true);
|
|
||||||
progIdKey.SetValue(null, progId);
|
|
||||||
|
|
||||||
var progIdRoot = Registry.LocalMachine.CreateSubKey($@"Software\Classes\{progId}", true);
|
|
||||||
progIdRoot.SetValue(null, typeName);
|
|
||||||
var progIdSubKey = progIdRoot.CreateSubKey("CLSID");
|
|
||||||
progIdSubKey.SetValue(null, comGuid.ToString("B"));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void UnregisterFrameworkAssembly(Type t)
|
|
||||||
{
|
|
||||||
var comGuid = GetComGuid(t);
|
|
||||||
var progId = GetComProgId(t);
|
|
||||||
|
|
||||||
UnregisterClass(comGuid, progId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void UnregisterClass(Guid clsid)
|
|
||||||
{
|
|
||||||
string progid = null;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
progid = GetProgIdFromClasid(clsid);
|
|
||||||
}
|
|
||||||
catch (NotFoundException) { }
|
|
||||||
|
|
||||||
UnregisterClass(clsid, progid);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void UnregisterClass(string progId)
|
|
||||||
{
|
|
||||||
Guid? clsid = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
clsid = GetClsidFromProgId(progId);
|
|
||||||
}
|
|
||||||
catch (NotFoundException) { }
|
|
||||||
|
|
||||||
UnregisterClass(clsid, progId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Guid GetClsidFromProgId(string progId)
|
|
||||||
{
|
|
||||||
var value = Registry.ClassesRoot.OpenSubKey($@"{progId}\CLSID")?.GetValue(string.Empty) as string;
|
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(value))
|
|
||||||
{
|
|
||||||
throw new ClsidNotFoundException($"The clsid for ProgId was not found {progId}");
|
|
||||||
}
|
|
||||||
|
|
||||||
return Guid.Parse(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string GetProgIdFromClasid(Guid clsid)
|
|
||||||
{
|
|
||||||
var value = Registry.ClassesRoot.OpenSubKey($@"CLSID\{clsid:B}\ProgId")?.GetValue(string.Empty) as string;
|
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(value))
|
|
||||||
{
|
|
||||||
throw new ProgIdNotFoundException($"The ProgId for clsid was not found {clsid}");
|
|
||||||
}
|
|
||||||
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string GetTypeAssemblyLocation(Type type)
|
|
||||||
{
|
|
||||||
return type.Assembly.Location;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string GetTypeAssemblyName(Type type)
|
|
||||||
{
|
|
||||||
return type.Assembly.FullName;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string GetTypeClassName(Type type)
|
|
||||||
{
|
|
||||||
return type.Name;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string GetTypeFullName(Type type)
|
|
||||||
{
|
|
||||||
return type.FullName;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Guid GetComGuid(Type type)
|
|
||||||
{
|
|
||||||
var typeId = type.GetCustomAttributeValue("GuidAttribute");
|
|
||||||
|
|
||||||
if (typeId == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentException($"The type {type.Name} does not have the Guid attribute present");
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Guid(typeId);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string GetComProgId(Type type)
|
|
||||||
{
|
|
||||||
var typeId = type.GetCustomAttributeValue("ProgIdAttribute");
|
|
||||||
|
|
||||||
if (typeId == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentException($"The type {type.Name} does not have the ProgId attribute present");
|
|
||||||
}
|
|
||||||
|
|
||||||
return typeId;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool IsFrameworkType(Type type)
|
|
||||||
{
|
|
||||||
return IsFrameworkAssembly(type.Assembly);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool IsFrameworkAssembly(Assembly assembly)
|
|
||||||
{
|
|
||||||
var framework = assembly.GetCustomAttributeValue("TargetFrameworkAttribute");
|
|
||||||
return framework.StartsWith(".NETFramework");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static string GetCustomAttributeValue(this Type type, string attributeName)
|
|
||||||
{
|
|
||||||
var cads = type.GetCustomAttributesData();
|
|
||||||
foreach (CustomAttributeData cad in cads.Where(a => a.AttributeType.Name == attributeName))
|
|
||||||
{
|
|
||||||
return cad.ConstructorArguments.FirstOrDefault().Value as string;
|
|
||||||
}
|
|
||||||
|
|
||||||
return String.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string GetCustomAttributeValue(this Assembly assembly, string attributeName)
|
|
||||||
{
|
|
||||||
foreach (CustomAttributeData cad in assembly.GetCustomAttributesData().Where(a => a.AttributeType.Name == attributeName))
|
|
||||||
{
|
|
||||||
return cad.ConstructorArguments.FirstOrDefault().Value as string;
|
|
||||||
}
|
|
||||||
|
|
||||||
return String.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IEnumerable<Type> GetCredentialProviders(Assembly assembly)
|
|
||||||
{
|
|
||||||
return assembly.GetExportedTypes().Where(t => t.GetInterfaces().Any(ifn => ifn.Name == "ICredentialProvider") && !t.IsAbstract && !t.IsInterface);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Assembly LoadAssembly(string assemblyPath)
|
|
||||||
{
|
|
||||||
string assemblyBasePath = Path.GetDirectoryName(assemblyPath);
|
|
||||||
|
|
||||||
List<string> paths = new List<string>();
|
|
||||||
paths.AddRange(Directory.GetFiles(assemblyBasePath));
|
|
||||||
paths.Add(typeof(object).Assembly.Location);
|
|
||||||
|
|
||||||
// needs to be the .net fx or net core fx location
|
|
||||||
paths.AddRange(Directory.GetFiles(RuntimeEnvironment.GetRuntimeDirectory(), "*.dll"));
|
|
||||||
|
|
||||||
var resolver = new PathAssemblyResolver(paths);
|
|
||||||
MetadataLoadContext mlc = new MetadataLoadContext(resolver);
|
|
||||||
return mlc.LoadFromAssemblyPath(assemblyPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Management.Automation;
|
|
||||||
|
|
||||||
namespace Lithnet.CredentialProvider.RegistrationTool
|
|
||||||
{
|
|
||||||
[Cmdlet(VerbsLifecycle.Disable, "CredentialProvider", DefaultParameterSetName = "DisableByFileName")]
|
|
||||||
public class DisableCredentialProviderCmdlet : PSCmdlet
|
|
||||||
{
|
|
||||||
[Parameter(ParameterSetName = "DisableByFileName")]
|
|
||||||
public string File { get; set; }
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = "DisableByClsid")]
|
|
||||||
public Guid Clsid { get; set; }
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = "DisableByProgId")]
|
|
||||||
public string ProgId { get; set; }
|
|
||||||
|
|
||||||
protected override void ProcessRecord()
|
|
||||||
{
|
|
||||||
if (this.ParameterSetName == "DisableByFileName")
|
|
||||||
{
|
|
||||||
if (!CredentialProviderRegistrationServices.IsManagedAssembly(this.File))
|
|
||||||
{
|
|
||||||
throw new System.Exception("This tool cannot disable managed assemblies by file name. You can disable native assemblies using the CLSID or ProgID");
|
|
||||||
}
|
|
||||||
var assembly = CredentialProviderRegistrationServices.LoadAssembly(this.File);
|
|
||||||
|
|
||||||
foreach (var type in CredentialProviderRegistrationServices.GetCredentialProviders(assembly))
|
|
||||||
{
|
|
||||||
CredentialProviderRegistrationServices.DisableCredentialProvider(type);
|
|
||||||
this.WriteVerbose($"Disabled credential provider {type.FullName}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (this.ParameterSetName == "DisableByClsid")
|
|
||||||
{
|
|
||||||
CredentialProviderRegistrationServices.DisableCredentialProvider(this.Clsid);
|
|
||||||
}
|
|
||||||
else if (this.ParameterSetName == "DisableByProgId")
|
|
||||||
{
|
|
||||||
var clsid = CredentialProviderRegistrationServices.GetClsidFromProgId(this.ProgId);
|
|
||||||
CredentialProviderRegistrationServices.DisableCredentialProvider(clsid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
namespace Lithnet.CredentialProvider.RegistrationTool
|
|
||||||
{
|
|
||||||
public enum DllType
|
|
||||||
{
|
|
||||||
Unknown,
|
|
||||||
NetFramework,
|
|
||||||
NetCore,
|
|
||||||
Native
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Management.Automation;
|
|
||||||
|
|
||||||
namespace Lithnet.CredentialProvider.RegistrationTool
|
|
||||||
{
|
|
||||||
[Cmdlet(VerbsLifecycle.Enable, "CredentialProvider", DefaultParameterSetName = "EnableByFileName")]
|
|
||||||
public class EnableCredentialProviderCmdlet : PSCmdlet
|
|
||||||
{
|
|
||||||
[Parameter(ParameterSetName = "EnableByFileName")]
|
|
||||||
public string File { get; set; }
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = "EnableByClsid")]
|
|
||||||
public Guid Clsid { get; set; }
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = "EnableByProgId")]
|
|
||||||
public string ProgId { get; set; }
|
|
||||||
|
|
||||||
protected override void ProcessRecord()
|
|
||||||
{
|
|
||||||
if (this.ParameterSetName == "EnableByFileName")
|
|
||||||
{
|
|
||||||
if (!CredentialProviderRegistrationServices.IsManagedAssembly(this.File))
|
|
||||||
{
|
|
||||||
throw new System.Exception("This tool cannot enable managed assemblies by file name. You can enable native assemblies using the CLSID or ProgID");
|
|
||||||
}
|
|
||||||
|
|
||||||
var assembly = CredentialProviderRegistrationServices.LoadAssembly(this.File);
|
|
||||||
|
|
||||||
foreach (var type in CredentialProviderRegistrationServices.GetCredentialProviders(assembly))
|
|
||||||
{
|
|
||||||
CredentialProviderRegistrationServices.EnableCredentialProvider(type);
|
|
||||||
this.WriteVerbose($"Enabled credential provider {type.FullName}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (this.ParameterSetName == "EnableByClsid")
|
|
||||||
{
|
|
||||||
CredentialProviderRegistrationServices.EnableCredentialProvider(this.Clsid);
|
|
||||||
}
|
|
||||||
else if (this.ParameterSetName == "EnableByProgId")
|
|
||||||
{
|
|
||||||
var clsid = CredentialProviderRegistrationServices.GetClsidFromProgId(this.ProgId);
|
|
||||||
CredentialProviderRegistrationServices.EnableCredentialProvider(clsid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
using System;
|
|
||||||
|
|
||||||
namespace Lithnet.CredentialProvider
|
|
||||||
{
|
|
||||||
public class ClsidNotFoundException : NotFoundException
|
|
||||||
{
|
|
||||||
public ClsidNotFoundException() : base()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public ClsidNotFoundException(string message) : base(message)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public ClsidNotFoundException(string message, Exception innerException) : base(message, innerException)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
using System;
|
|
||||||
|
|
||||||
namespace Lithnet.CredentialProvider
|
|
||||||
{
|
|
||||||
public class NotFoundException : Exception
|
|
||||||
{
|
|
||||||
public NotFoundException() : base()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public NotFoundException(string message) : base(message)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public NotFoundException(string message, Exception innerException) : base(message, innerException)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
using System;
|
|
||||||
|
|
||||||
namespace Lithnet.CredentialProvider
|
|
||||||
{
|
|
||||||
public class ProgIdNotFoundException : NotFoundException
|
|
||||||
{
|
|
||||||
public ProgIdNotFoundException() : base()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public ProgIdNotFoundException(string message) : base(message)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public ProgIdNotFoundException(string message, Exception innerException) : base(message, innerException)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Management.Automation;
|
|
||||||
|
|
||||||
namespace Lithnet.CredentialProvider.RegistrationTool
|
|
||||||
{
|
|
||||||
[Cmdlet(VerbsCommon.Get, "CredentialProvider", DefaultParameterSetName = "None")]
|
|
||||||
public class GetCredentialProviderCmdlet : PSCmdlet
|
|
||||||
{
|
|
||||||
[Parameter(ParameterSetName = "GetByFileName")]
|
|
||||||
public string File { get; set; }
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = "GetByClsid")]
|
|
||||||
public Guid Clsid { get; set; }
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = "GetByProgId")]
|
|
||||||
public string ProgId { get; set; }
|
|
||||||
|
|
||||||
protected override void ProcessRecord()
|
|
||||||
{
|
|
||||||
if (this.ParameterSetName == "None")
|
|
||||||
{
|
|
||||||
foreach (var item in CredentialProviderRegistrationServices.GetCredentalProviders())
|
|
||||||
{
|
|
||||||
this.WriteObject(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (this.ParameterSetName == "GetByFileName")
|
|
||||||
{
|
|
||||||
var assembly = CredentialProviderRegistrationServices.LoadAssembly(this.File);
|
|
||||||
|
|
||||||
foreach (var type in CredentialProviderRegistrationServices.GetCredentialProviders(assembly))
|
|
||||||
{
|
|
||||||
CredentialProviderRegistrationServices.GetCredentialProvider(type);
|
|
||||||
this.WriteVerbose($"Got credential provider {type.FullName}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (this.ParameterSetName == "GetByClsid")
|
|
||||||
{
|
|
||||||
CredentialProviderRegistrationServices.GetCredentialProvider(this.Clsid);
|
|
||||||
}
|
|
||||||
else if (this.ParameterSetName == "GetByProgId")
|
|
||||||
{
|
|
||||||
var clsid = CredentialProviderRegistrationServices.GetClsidFromProgId(this.ProgId);
|
|
||||||
CredentialProviderRegistrationServices.GetCredentialProvider(clsid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-35
@@ -1,35 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net461</TargetFramework>
|
|
||||||
<Platform>AnyCPU</Platform>
|
|
||||||
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<None Remove="Lithnet.CredentialProvider.Management.psd1" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.Win32.Registry" Version="5.0.0" />
|
|
||||||
<PackageReference Include="PowerShellStandard.Library" Version="5.1.1" />
|
|
||||||
<PackageReference Include="System.Reflection.MetadataLoadContext" Version="6.0.0" />
|
|
||||||
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Content Include="Lithnet.CredentialProvider.Management.psd1">
|
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
|
|
||||||
<Target Name="AfterResolveReferences2" AfterTargets="ResolveAssemblyReferences">
|
|
||||||
<ItemGroup>
|
|
||||||
<EmbeddedResource Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.Extension)' == '.dll'">
|
|
||||||
<LogicalName>%(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)</LogicalName>
|
|
||||||
</EmbeddedResource>
|
|
||||||
<ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Target>
|
|
||||||
</Project>
|
|
||||||
@@ -1,124 +0,0 @@
|
|||||||
@{
|
|
||||||
|
|
||||||
# Script module or binary module file associated with this manifest.
|
|
||||||
RootModule = 'Lithnet.CredentialProvider.Management.dll'
|
|
||||||
|
|
||||||
# Version number of this module.
|
|
||||||
ModuleVersion = '1.0.0'
|
|
||||||
|
|
||||||
# Supported PSEditions
|
|
||||||
CompatiblePSEditions = @('Desktop' ,'Core')
|
|
||||||
|
|
||||||
# ID used to uniquely identify this module
|
|
||||||
GUID = '7cbafd6a-cfe0-4380-b3f3-a161a9b96792'
|
|
||||||
|
|
||||||
# Author of this module
|
|
||||||
Author = 'Lithnet Pty Ltd'
|
|
||||||
|
|
||||||
# Company or vendor of this module
|
|
||||||
CompanyName = 'Lithnet Pty Ltd'
|
|
||||||
|
|
||||||
# Copyright statement for this module
|
|
||||||
Copyright = '(c) Lithnet Pty Ltd 2023. All rights reserved.'
|
|
||||||
|
|
||||||
# Description of the functionality provided by this module
|
|
||||||
Description = 'This module provides cmdlets fot the management of Windows Credential providers'
|
|
||||||
|
|
||||||
# Minimum version of the PowerShell engine required by this module
|
|
||||||
PowerShellVersion = '5.1'
|
|
||||||
|
|
||||||
# Name of the PowerShell host required by this module
|
|
||||||
# PowerShellHostName = ''
|
|
||||||
|
|
||||||
# Minimum version of the PowerShell host required by this module
|
|
||||||
# PowerShellHostVersion = ''
|
|
||||||
|
|
||||||
# Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only.
|
|
||||||
DotNetFrameworkVersion = '4.6.1'
|
|
||||||
|
|
||||||
# Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only.
|
|
||||||
ClrVersion = '4.0'
|
|
||||||
|
|
||||||
# Processor architecture (None, X86, Amd64) required by this module
|
|
||||||
# ProcessorArchitecture = ''
|
|
||||||
|
|
||||||
# Modules that must be imported into the global environment prior to importing this module
|
|
||||||
# RequiredModules = @()
|
|
||||||
|
|
||||||
# Assemblies that must be loaded prior to importing this module
|
|
||||||
# RequiredAssemblies = @()
|
|
||||||
|
|
||||||
# Script files (.ps1) that are run in the caller's environment prior to importing this module.
|
|
||||||
# ScriptsToProcess = @()
|
|
||||||
|
|
||||||
# Type files (.ps1xml) to be loaded when importing this module
|
|
||||||
# TypesToProcess = @()
|
|
||||||
|
|
||||||
# Format files (.ps1xml) to be loaded when importing this module
|
|
||||||
# FormatsToProcess = @()
|
|
||||||
|
|
||||||
# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess
|
|
||||||
# NestedModules = @()
|
|
||||||
|
|
||||||
# Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export.
|
|
||||||
FunctionsToExport = @()
|
|
||||||
|
|
||||||
# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export.
|
|
||||||
CmdletsToExport = @('Register-CredentialProvider', 'Unregister-CredentialProvider', 'Enable-CredentialProvider', 'Disable-CredentialProvider', 'Get-CredentialProvider')
|
|
||||||
|
|
||||||
# Variables to export from this module
|
|
||||||
VariablesToExport = '*'
|
|
||||||
|
|
||||||
# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export.
|
|
||||||
AliasesToExport = @()
|
|
||||||
|
|
||||||
# DSC resources to export from this module
|
|
||||||
# DscResourcesToExport = @()
|
|
||||||
|
|
||||||
# List of all modules packaged with this module
|
|
||||||
# ModuleList = @()
|
|
||||||
|
|
||||||
# List of all files packaged with this module
|
|
||||||
# FileList = @()
|
|
||||||
|
|
||||||
# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell.
|
|
||||||
PrivateData = @{
|
|
||||||
|
|
||||||
PSData = @{
|
|
||||||
|
|
||||||
# Tags applied to this module. These help with module discovery in online galleries.
|
|
||||||
Tags = @("Windows" ,"PSEdition_Desktop", "PSEdition_Core")
|
|
||||||
|
|
||||||
# A URL to the license for this module.
|
|
||||||
LicenseUri = 'https://github.com/lithnet/windows-credential-provider/blob/main/LICENSE'
|
|
||||||
|
|
||||||
# A URL to the main website for this project.
|
|
||||||
ProjectUri = 'https://github.com/lithnet/windows-credential-provider'
|
|
||||||
|
|
||||||
# A URL to an icon representing this module.
|
|
||||||
# IconUri = ''
|
|
||||||
|
|
||||||
# ReleaseNotes of this module
|
|
||||||
ReleaseNotes = 'https://github.com/lithnet/windows-credential-provider'
|
|
||||||
|
|
||||||
# Prerelease string of this module
|
|
||||||
# Prerelease = ''
|
|
||||||
|
|
||||||
# Flag to indicate whether the module requires explicit user acceptance for install/update/save
|
|
||||||
RequireLicenseAcceptance = $false
|
|
||||||
|
|
||||||
# External dependent modules of this module
|
|
||||||
# ExternalModuleDependencies = @()
|
|
||||||
|
|
||||||
} # End of PSData hashtable
|
|
||||||
|
|
||||||
} # End of PrivateData hashtable
|
|
||||||
|
|
||||||
# HelpInfo URI of this module
|
|
||||||
# HelpInfoURI = ''
|
|
||||||
|
|
||||||
# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix.
|
|
||||||
# DefaultCommandPrefix = ''
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,118 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Management.Automation;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Runtime.Loader;
|
|
||||||
|
|
||||||
namespace Lithnet.CredentialProvider.RegistrationTool
|
|
||||||
{
|
|
||||||
public class ModuleInitializer : IModuleAssemblyInitializer, IModuleAssemblyCleanup
|
|
||||||
{
|
|
||||||
public static bool IsFullFramework => typeof(object).Assembly.FullName.StartsWith("mscorlib", StringComparison.OrdinalIgnoreCase);
|
|
||||||
private Dictionary<string, Assembly> assemblies = new Dictionary<string, Assembly>();
|
|
||||||
|
|
||||||
public void OnImport()
|
|
||||||
{
|
|
||||||
Trace.WriteLine($"Initializing PowerShell module loaded in {(IsFullFramework ? "netfx" : "netcore")}");
|
|
||||||
|
|
||||||
this.PreloadAssemblies();
|
|
||||||
this.HookResolvers();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnRemove(PSModuleInfo psModuleInfo)
|
|
||||||
{
|
|
||||||
this.UnhookResolvers();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void PreloadAssemblies()
|
|
||||||
{
|
|
||||||
var executingAssembly = Assembly.GetExecutingAssembly();
|
|
||||||
|
|
||||||
foreach (string resource in executingAssembly.GetManifestResourceNames().Where(n => n.EndsWith(".dll")))
|
|
||||||
{
|
|
||||||
using (var stream = executingAssembly.GetManifestResourceStream(resource))
|
|
||||||
{
|
|
||||||
if (stream == null)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Trace.WriteLine("Preloading assembly: " + resource);
|
|
||||||
|
|
||||||
if (IsFullFramework)
|
|
||||||
{
|
|
||||||
var bytes = new byte[stream.Length];
|
|
||||||
stream.Read(bytes, 0, bytes.Length);
|
|
||||||
this.assemblies.Add(resource, Assembly.Load(bytes));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this.assemblies.Add(resource, AssemblyContextResourceLoader.LoadIntoAlc(stream));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Trace.TraceError("Failed to load: {0}\r\n", resource, ex.ToString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void HookResolvers()
|
|
||||||
{
|
|
||||||
AppDomain.CurrentDomain.AssemblyResolve += this.ResolveAssembly;
|
|
||||||
|
|
||||||
if (!IsFullFramework)
|
|
||||||
{
|
|
||||||
this.HookAssemblyLoadContextResolver();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UnhookResolvers()
|
|
||||||
{
|
|
||||||
AppDomain.CurrentDomain.AssemblyResolve -= this.ResolveAssembly;
|
|
||||||
|
|
||||||
if (!IsFullFramework)
|
|
||||||
{
|
|
||||||
this.UnhookAssemblyLoadContextResolver();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void HookAssemblyLoadContextResolver()
|
|
||||||
{
|
|
||||||
AssemblyLoadContext.Default.Resolving += this.ResolveAssembly;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UnhookAssemblyLoadContextResolver()
|
|
||||||
{
|
|
||||||
AssemblyLoadContext.Default.Resolving += this.ResolveAssembly;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Assembly ResolveAssembly(object s, ResolveEventArgs e)
|
|
||||||
{
|
|
||||||
var assemblyName = new AssemblyName(e.Name);
|
|
||||||
return this.ResolveAssemblyFromCache(assemblyName);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Assembly ResolveAssembly(AssemblyLoadContext defaultAlc, AssemblyName assemblyName)
|
|
||||||
{
|
|
||||||
return this.ResolveAssemblyFromCache(assemblyName);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Assembly ResolveAssemblyFromCache(AssemblyName assemblyName)
|
|
||||||
{
|
|
||||||
var path = string.Format("{0}.dll", assemblyName.Name);
|
|
||||||
|
|
||||||
if (this.assemblies.ContainsKey(path))
|
|
||||||
{
|
|
||||||
return this.assemblies[path];
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"profiles": {
|
|
||||||
"Lithnet.CredentialProvider.RegistrationTool": {
|
|
||||||
"commandName": "Project",
|
|
||||||
"commandLineArgs": "--unregister \"D:\\dev\\git\\ryannewington\\CredProvider.NET\\CredProvider.NET\\bin\\Debug\\CredProvider.NET.dll\""
|
|
||||||
//"commandLineArgs": "--register \"D:\\dev\\git\\lithnet\\windows-credential-provider\\src\\samples\\Lithnet.CredentialProvider.Sample.net6.0.x64\\bin\\Debug\\net6.0-windows\\Lithnet.CredentialProvider.Sample.net6.0.x64.dll\""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
using System.Management.Automation;
|
|
||||||
|
|
||||||
namespace Lithnet.CredentialProvider.RegistrationTool
|
|
||||||
{
|
|
||||||
[Cmdlet(VerbsLifecycle.Register, "CredentialProvider")]
|
|
||||||
public class RegisterCredentialProviderCmdlet : PSCmdlet
|
|
||||||
{
|
|
||||||
[Parameter]
|
|
||||||
public string File { get; set; }
|
|
||||||
|
|
||||||
protected override void ProcessRecord()
|
|
||||||
{
|
|
||||||
if (!CredentialProviderRegistrationServices.IsManagedAssembly(this.File))
|
|
||||||
{
|
|
||||||
throw new System.Exception("This tool can only register managed assemblies");
|
|
||||||
}
|
|
||||||
|
|
||||||
var assembly = CredentialProviderRegistrationServices.LoadAssembly(this.File);
|
|
||||||
|
|
||||||
foreach (var type in CredentialProviderRegistrationServices.GetCredentialProviders(assembly))
|
|
||||||
{
|
|
||||||
CredentialProviderRegistrationServices.RegisterCredentialProvider(type);
|
|
||||||
this.WriteVerbose($"Registered credential provider {type.FullName}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Management.Automation;
|
|
||||||
|
|
||||||
namespace Lithnet.CredentialProvider.RegistrationTool
|
|
||||||
{
|
|
||||||
[Cmdlet(VerbsLifecycle.Unregister, "CredentialProvider", DefaultParameterSetName = "UnregisterByFileName")]
|
|
||||||
public class UnregisterCredentialProviderCmdlet : PSCmdlet
|
|
||||||
{
|
|
||||||
[Parameter(ParameterSetName = "UnregisterByFileName")]
|
|
||||||
public string File { get; set; }
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = "UnregisterByClsid")]
|
|
||||||
public Guid Clsid { get; set; }
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName = "UnregisterByProgId")]
|
|
||||||
public string ProgId { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public SwitchParameter UnregisterCom { get; set; }
|
|
||||||
|
|
||||||
protected override void ProcessRecord()
|
|
||||||
{
|
|
||||||
if (this.ParameterSetName == "UnregisterByFileName")
|
|
||||||
{
|
|
||||||
if (!CredentialProviderRegistrationServices.IsManagedAssembly(this.File))
|
|
||||||
{
|
|
||||||
throw new Exception("This tool cannot unregister managed assemblies by file name. You can unregister native assemblies using the CLSID or ProgID");
|
|
||||||
}
|
|
||||||
|
|
||||||
var assembly = CredentialProviderRegistrationServices.LoadAssembly(this.File);
|
|
||||||
|
|
||||||
foreach (var type in CredentialProviderRegistrationServices.GetCredentialProviders(assembly))
|
|
||||||
{
|
|
||||||
CredentialProviderRegistrationServices.UnregisterCredentialProvider(type, this.GetSwitchValue(this.UnregisterCom, nameof(this.UnregisterCom)));
|
|
||||||
this.WriteVerbose($"Unregistered credential provider {type.FullName}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (this.ParameterSetName == "UnregisterByClsid")
|
|
||||||
{
|
|
||||||
CredentialProviderRegistrationServices.UnregisterCredentialProvider(this.Clsid, this.GetSwitchValue(this.UnregisterCom, nameof(this.UnregisterCom)));
|
|
||||||
}
|
|
||||||
else if (this.ParameterSetName == "UnregisterByProgId")
|
|
||||||
{
|
|
||||||
var clsid = CredentialProviderRegistrationServices.GetClsidFromProgId(this.ProgId);
|
|
||||||
CredentialProviderRegistrationServices.UnregisterCredentialProvider(clsid, this.GetSwitchValue(this.UnregisterCom, nameof(this.UnregisterCom)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected bool GetSwitchValue(SwitchParameter parameter, string name)
|
|
||||||
{
|
|
||||||
if (this.MyInvocation.BoundParameters.ContainsKey(name))
|
|
||||||
{
|
|
||||||
return parameter.ToBool();
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -23,8 +23,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Lithnet.CredentialProvider.
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Lithnet.CredentialProvider.TestApp.x86", "samples\Lithnet.CredentialProvider.TestApp.x86\Lithnet.CredentialProvider.TestApp.x86.csproj", "{F39C84F2-60C2-45EB-BC87-0ED095D41C96}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Lithnet.CredentialProvider.TestApp.x86", "samples\Lithnet.CredentialProvider.TestApp.x86\Lithnet.CredentialProvider.TestApp.x86.csproj", "{F39C84F2-60C2-45EB-BC87-0ED095D41C96}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Lithnet.CredentialProvider.Management", "Lithnet.CredentialProvider.Management\Lithnet.CredentialProvider.Management.csproj", "{6A9A22A9-A2BB-4329-A0A5-2539E464CE5F}"
|
|
||||||
EndProject
|
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -59,10 +57,6 @@ Global
|
|||||||
{F39C84F2-60C2-45EB-BC87-0ED095D41C96}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{F39C84F2-60C2-45EB-BC87-0ED095D41C96}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{F39C84F2-60C2-45EB-BC87-0ED095D41C96}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{F39C84F2-60C2-45EB-BC87-0ED095D41C96}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{F39C84F2-60C2-45EB-BC87-0ED095D41C96}.Release|Any CPU.Build.0 = Release|Any CPU
|
{F39C84F2-60C2-45EB-BC87-0ED095D41C96}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{6A9A22A9-A2BB-4329-A0A5-2539E464CE5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{6A9A22A9-A2BB-4329-A0A5-2539E464CE5F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{6A9A22A9-A2BB-4329-A0A5-2539E464CE5F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{6A9A22A9-A2BB-4329-A0A5-2539E464CE5F}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
Reference in New Issue
Block a user