-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProgram.cs
108 lines (99 loc) · 4.17 KB
/
Program.cs
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
102
103
104
105
106
107
108
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Text;
namespace GetUserSid
{
internal class Program
{
const int NO_ERROR = 0;
const int ERROR_INSUFFICIENT_BUFFER = 122;
const int ERROR_INVALID_FLAGS = 1004;
[DllImport("advapi32.dll", SetLastError = true)]
static extern bool LookupAccountName(string lpSystemName, string lpAccountName, [MarshalAs(UnmanagedType.LPArray)] byte[] Sid, ref uint cbSid, StringBuilder ReferencedDomainName, ref uint cchReferencedDomainName, out SID_NAME_USE peUse);
[DllImport("advapi32", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool ConvertSidToStringSid([MarshalAs(UnmanagedType.LPArray)] byte[] pSID,out IntPtr ptrSid);
[DllImport("advapi32", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool ConvertSidToStringSid(IntPtr pSid, out string strSid);
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr LocalFree(IntPtr hMem);
enum SID_NAME_USE
{
SidTypeUser = 1,
SidTypeGroup,
SidTypeDomain,
SidTypeAlias,
SidTypeWellKnownGroup,
SidTypeDeletedAccount,
SidTypeInvalid,
SidTypeUnknown,
SidTypeComputer
};
enum FORMAT_MESSAGE : uint
{
ALLOCATE_BUFFER = 0x00000100,
IGNORE_INSERTS = 0x00000200,
FROM_SYSTEM = 0x00001000,
ARGUMENT_ARRAY = 0x00002000,
FROM_HMODULE = 0x00000800,
FROM_STRING = 0x00000400
};
static void Main(string[] args)
{
Console.WriteLine($"GetUserSid, by Hannah Vernon, v{System.Reflection.Assembly.GetExecutingAssembly().GetName().Version:s}");
if (args.Length == 0)
{
Console.WriteLine();
Console.WriteLine("Usage is: GetUserSid <username>");
}
else
{
var accountName = args[0];
string? systemName = null;
byte[]? sid = null;
uint cbSid = 0;
StringBuilder referencedDomainName = new StringBuilder();
uint cchReferencedDomainName = (uint)referencedDomainName.Capacity;
SID_NAME_USE sidUse;
int err = NO_ERROR;
IntPtr ptrSid;
if (!LookupAccountName(systemName, accountName, sid, ref cbSid, referencedDomainName, ref cchReferencedDomainName, out sidUse))
{
err = Marshal.GetLastWin32Error();
if (err == ERROR_INSUFFICIENT_BUFFER || err == ERROR_INVALID_FLAGS)
{
sid = new byte[cbSid];
referencedDomainName.EnsureCapacity((int)cchReferencedDomainName);
err = NO_ERROR;
if (!LookupAccountName(systemName, accountName, sid, ref cbSid, referencedDomainName, ref cchReferencedDomainName, out sidUse))
{
err = Marshal.GetLastWin32Error();
};
};
}
else
{
Console.WriteLine($"{accountName} not found.");
}
if (err == NO_ERROR)
{
if (!ConvertSidToStringSid(sid, out ptrSid))
{
err = Marshal.GetLastWin32Error();
Console.WriteLine(@"Could not convert Security Identifier to string. Error : {0}", err);
}
else
{
string? sidString = Marshal.PtrToStringAuto(ptrSid);
LocalFree(ptrSid);
Console.WriteLine(@"{0} has a type of {1}. The Security Identifier is {2}", accountName, sidUse, sidString);
}
}
else
{
var msg = new Win32Exception(err).Message;
Console.WriteLine($"{msg}");
};
};
}
};
};