-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAssocQueryString.ps1
More file actions
101 lines (90 loc) · 3.04 KB
/
AssocQueryString.ps1
File metadata and controls
101 lines (90 loc) · 3.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#
# original code from https://stackoverflow.com/a/60972216
#
# modified to work with the 'assoc' built-in command
#
# C:\> assoc > assoc.txt
#
# (replace =.* with nothing to create a .ext file)
#
# C:\> .\AssocQueryString.ps1
#
$Signature = @"
using System;
using System.Runtime.InteropServices;
using System.Text;
public static class Win32Api
{
[DllImport("Shlwapi.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern uint AssocQueryString(AssocF flags, AssocStr str, string pszAssoc, string pszExtra,[Out] System.Text.StringBuilder pszOut, ref uint pcchOut);
public static string AssocQueryString(string extension)
{
return AssocQueryString(AssocF.None, AssocStr.Executable, extension);
}
internal static string AssocQueryString(AssocF assocF, AssocStr association, string assocString)
{
uint length = 0;
uint ret = AssocQueryString(assocF, association, assocString, null, null, ref length);
if (ret != 1) //expected S_FALSE
{
return null;
//throw new InvalidOperationException("Could not determine associated string");
}
var sb = new System.Text.StringBuilder((int) length); //(length-1) will probably work too as null termination is added
ret = AssocQueryString(assocF, association, assocString, null, sb, ref length);
if (ret != 0) //expected S_OK
{
return null;
//throw new InvalidOperationException("Could not determine associated string");
}
return sb.ToString();
}
[Flags]
internal enum AssocF : uint
{
None = 0,
Init_NoRemapCLSID = 0x1,
Init_ByExeName = 0x2,
Open_ByExeName = 0x2,
Init_DefaultToStar = 0x4,
Init_DefaultToFolder = 0x8,
NoUserSettings = 0x10,
NoTruncate = 0x20,
Verify = 0x40,
RemapRunDll = 0x80,
NoFixUps = 0x100,
IgnoreBaseClass = 0x200,
Init_IgnoreUnknown = 0x400,
Init_FixedProgId = 0x800,
IsProtocol = 0x1000,
InitForFile = 0x2000,
}
internal enum AssocStr
{
Command = 1,
Executable,
FriendlyDocName,
FriendlyAppName,
NoOpen,
ShellNewValue,
DDECommand,
DDEIfExec,
DDEApplication,
DDETopic,
InfoTip,
QuickTip,
TileInfo,
ContentType,
DefaultIcon,
ShellExtension,
DropTarget,
DelegateExecute,
SupportedUriProtocols,
Max,
}
}
"@
Add-Type -TypeDefinition $Signature
foreach($assoc in Get-Content .\assoc.txt) {
Write-Output "$assoc :: $([Win32Api]::AssocQueryString($assoc))"
}