Created
December 2, 2022 21:09
-
-
Save ericlaw1979/81a10f58e59917ed4fe2c4e22576755a to your computer and use it in GitHub Desktop.
csc.exe mutz.cs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.IO; | |
using System.Runtime.InteropServices; | |
namespace MUTZ | |
{ | |
[ComImport, GuidAttribute("79EAC9EE-BAF9-11CE-8C82-00AA004BA90B")] | |
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] | |
public interface IInternetSecurityManager | |
{ | |
[return: MarshalAs(UnmanagedType.I4)][PreserveSig] | |
int SetSecuritySite([In] IntPtr pSite); | |
[return: MarshalAs(UnmanagedType.I4)][PreserveSig] | |
int GetSecuritySite([Out] IntPtr pSite); | |
[return: MarshalAs(UnmanagedType.I4)][PreserveSig] | |
int MapUrlToZone([In,MarshalAs(UnmanagedType.LPWStr)] string pwszUrl, | |
ref UInt32 pdwZone, UInt32 dwFlags); | |
[return: MarshalAs(UnmanagedType.I4)][PreserveSig] | |
int GetSecurityId([MarshalAs(UnmanagedType.LPWStr)] string pwszUrl, | |
[MarshalAs(UnmanagedType.LPArray)] byte[] pbSecurityId, | |
ref UInt32 pcbSecurityId, uint dwReserved); | |
[return: MarshalAs(UnmanagedType.I4)][PreserveSig] | |
int ProcessUrlAction([In,MarshalAs(UnmanagedType.LPWStr)] string pwszUrl, | |
UInt32 dwAction, out byte pPolicy, UInt32 cbPolicy, | |
byte pContext, UInt32 cbContext, UInt32 dwFlags, | |
UInt32 dwReserved); | |
[return: MarshalAs(UnmanagedType.I4)][PreserveSig] | |
int QueryCustomPolicy([In,MarshalAs(UnmanagedType.LPWStr)] string pwszUrl, | |
ref Guid guidKey, ref byte ppPolicy, ref UInt32 pcbPolicy, | |
ref byte pContext, UInt32 cbContext, UInt32 dwReserved); | |
[return: MarshalAs(UnmanagedType.I4)][PreserveSig] | |
int SetZoneMapping(UInt32 dwZone, | |
[In,MarshalAs(UnmanagedType.LPWStr)] string lpszPattern, | |
UInt32 dwFlags); | |
[return: MarshalAs(UnmanagedType.I4)][PreserveSig] | |
int GetZoneMappings(UInt32 dwZone, out System.Runtime.InteropServices.ComTypes.IEnumString ppenumString, | |
UInt32 dwFlags); | |
} | |
public class MUTZ | |
{ | |
private readonly static Guid CLSID_SecurityManager = new Guid("7b8a2d94-0ac9-11d1-896c-00c04fb6bfc4"); | |
public static int Main(string[] args) | |
{ | |
UInt32 iZone=0; | |
string sURL = "https://example.com/"; | |
if (args.Length > 0) | |
{ | |
sURL = args[0]; | |
} | |
else | |
{ | |
Console.WriteLine("Usage: mutz.exe https://host/path?query#fragment\n\n"); | |
} | |
Type t = Type.GetTypeFromCLSID(CLSID_SecurityManager); | |
object securityManager = Activator.CreateInstance(t); | |
IInternetSecurityManager ISM = securityManager as IInternetSecurityManager; | |
ISM.MapUrlToZone(sURL, ref iZone, 0); // TODO: Allow specification of flags https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/dd759042(v=vs.85) | |
Marshal.ReleaseComObject(securityManager); | |
string sZone; | |
switch (iZone) | |
{ | |
case 0: sZone = "LocalMachine"; break; | |
case 1: sZone = "LocalIntranet"; break; | |
case 2: sZone = "Trusted"; break; | |
case 3: sZone = "Internet"; break; | |
case 4: sZone = "Restricted"; break; | |
default: sZone = "~custom~"; break; | |
} | |
Console.WriteLine($"URL: {sURL}"); | |
Console.WriteLine($"Zone: {iZone} ({sZone})"); | |
Uri uri; | |
if (Uri.TryCreate(sURL, UriKind.Absolute, out uri)) { | |
if (uri.IsFile) { | |
string strPath = uri.LocalPath; | |
Console.WriteLine($"Filesystem Path: {strPath}"); | |
Console.WriteLine($"IsUnc: {uri.IsUnc}"); | |
if (uri.IsUnc) { | |
// 0x00000400 - MUTZ require saved file check | |
} | |
/* | |
// It would be nice if this worked, but it doesn't because .NET Framework doesn't support opening the alternate stream. | |
// See https://stackoverflow.com/questions/604960/how-to-read-and-modify-ntfs-alternate-data-streams-using-net | |
try { | |
string strMotW = File.ReadAllText($"{strPath}:Zone.Identifier"); | |
Console.WriteLine(":ZoneIdentifier\n{strMotW}\n-------------------------------------\n\n"); | |
} catch (Exception eX) { | |
Console.WriteLine($"ZoneIdentifier stream could not be read ({eX.Message})"); | |
} | |
*/ | |
} | |
} | |
return (int)iZone; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment