Skip to content

Commit 92a733e

Browse files
committed
Added Logon Provider enum.
1 parent f07c6d5 commit 92a733e

4 files changed

Lines changed: 88 additions & 8 deletions

File tree

NtApiDotNet/Win32/LogonUtils.cs

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,21 @@ public static class LogonUtils
118118
/// <returns>The logged on token.</returns>
119119
public static NtToken Logon(string user, string domain, string password, SecurityLogonType type)
120120
{
121-
if (!SecurityNativeMethods.LogonUser(user, domain, password, type, 0, out SafeKernelObjectHandle handle))
121+
return Logon(user, domain, password, type, Logon32Provider.Default);
122+
}
123+
124+
/// <summary>
125+
/// Logon a user with a username and password.
126+
/// </summary>
127+
/// <param name="user">The username.</param>
128+
/// <param name="domain">The user's domain.</param>
129+
/// <param name="password">The user's password.</param>
130+
/// <param name="type">The type of logon token.</param>
131+
/// <param name="provider">The Logon provider.</param>
132+
/// <returns>The logged on token.</returns>
133+
public static NtToken Logon(string user, string domain, string password, SecurityLogonType type, Logon32Provider provider)
134+
{
135+
if (!SecurityNativeMethods.LogonUser(user, domain, password, type, provider, out SafeKernelObjectHandle handle))
122136
{
123137
throw new SafeWin32Exception();
124138
}
@@ -132,9 +146,10 @@ public static NtToken Logon(string user, string domain, string password, Securit
132146
/// <param name="domain">The user's domain.</param>
133147
/// <param name="password">The user's password.</param>
134148
/// <param name="type">The type of logon token.</param>
149+
/// <param name="provider">The Logon provider.</param>
135150
/// <param name="groups">Additional groups to add. Needs SeTcbPrivilege.</param>
136151
/// <returns>The logged on token.</returns>
137-
public static NtToken Logon(string user, string domain, string password, SecurityLogonType type, IEnumerable<UserGroup> groups)
152+
public static NtToken Logon(string user, string domain, string password, SecurityLogonType type, Logon32Provider provider, IEnumerable<UserGroup> groups)
138153
{
139154
TokenGroupsBuilder builder = new TokenGroupsBuilder();
140155
foreach (var group in groups)
@@ -144,7 +159,7 @@ public static NtToken Logon(string user, string domain, string password, Securit
144159

145160
using (var group_buffer = builder.ToBuffer())
146161
{
147-
if (!SecurityNativeMethods.LogonUserExExW(user, domain, password, type, 0, group_buffer,
162+
if (!SecurityNativeMethods.LogonUserExExW(user, domain, password, type, provider, group_buffer,
148163
out SafeKernelObjectHandle token, null, null, null, null))
149164
{
150165
throw new SafeWin32Exception();
@@ -153,6 +168,20 @@ public static NtToken Logon(string user, string domain, string password, Securit
153168
}
154169
}
155170

171+
/// <summary>
172+
/// Logon a user with a username and password.
173+
/// </summary>
174+
/// <param name="user">The username.</param>
175+
/// <param name="domain">The user's domain.</param>
176+
/// <param name="password">The user's password.</param>
177+
/// <param name="type">The type of logon token.</param>
178+
/// <param name="groups">Additional groups to add. Needs SeTcbPrivilege.</param>
179+
/// <returns>The logged on token.</returns>
180+
public static NtToken Logon(string user, string domain, string password, SecurityLogonType type, IEnumerable<UserGroup> groups)
181+
{
182+
return Logon(user, domain, password, type, Logon32Provider.Default, groups);
183+
}
184+
156185
/// <summary>
157186
/// Logon user using Kerberos Ticket.
158187
/// </summary>

NtApiDotNet/Win32/Security/Native/SecurityNativeMethods.cs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,33 @@ internal delegate bool AuthzAccessCheckCallback(
3636
IntPtr pArgs,
3737
[MarshalAs(UnmanagedType.Bool)] out bool pbAceApplicable);
3838

39+
/// <summary>
40+
/// Logon32 provider
41+
/// </summary>
42+
public enum Logon32Provider
43+
{
44+
/// <summary>
45+
/// Default.
46+
/// </summary>
47+
Default = 0,
48+
/// <summary>
49+
/// Windows NT 3.5.
50+
/// </summary>
51+
WinNT35 = 1,
52+
/// <summary>
53+
/// Windows NT 4.0.
54+
/// </summary>
55+
WinNT40 = 2,
56+
/// <summary>
57+
/// Windows NT 5.0.
58+
/// </summary>
59+
WinNT50 = 3,
60+
/// <summary>
61+
/// Virtual provider.
62+
/// </summary>
63+
Virtual = 4
64+
}
65+
3966
internal static class SecurityNativeMethods
4067
{
4168
[DllImport("Secur32.dll", CharSet = CharSet.Unicode)]
@@ -522,15 +549,15 @@ out NtStatus SubStatus
522549

523550
[DllImport("Advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
524551
internal static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, SecurityLogonType dwLogonType,
525-
int dwLogonProvider, out SafeKernelObjectHandle phToken);
552+
Logon32Provider dwLogonProvider, out SafeKernelObjectHandle phToken);
526553

527554
[DllImport("Advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
528555
internal static extern bool LogonUserExExW(
529556
string lpszUsername,
530557
string lpszDomain,
531558
string lpszPassword,
532559
SecurityLogonType dwLogonType,
533-
int dwLogonProvider,
560+
Logon32Provider dwLogonProvider,
534561
SafeTokenGroupsBuffer pTokenGroups,
535562
out SafeKernelObjectHandle phToken,
536563
[Out] OptionalPointer ppLogonSid,

NtApiDotNet/Win32/TokenUtils.cs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
using NtApiDotNet.Win32.Security.Native;
1516
using System;
1617
using System.Collections.Generic;
1718
using System.Runtime.InteropServices;
@@ -100,6 +101,22 @@ public static NtToken GetAnonymousToken()
100101
/// <param name="groups">Optional list of additonal groups to add.</param>
101102
/// <returns>The logged on token.</returns>
102103
public static NtToken GetLogonUserToken(string username, string domain, string password, SecurityLogonType logon_type, IEnumerable<UserGroup> groups)
104+
{
105+
return GetLogonUserToken(username, domain, password, logon_type, Logon32Provider.Default, groups);
106+
}
107+
108+
/// <summary>
109+
/// Logon a user.
110+
/// </summary>
111+
/// <param name="username">The username.</param>
112+
/// <param name="domain">The user's domain.</param>
113+
/// <param name="password">The user's password.</param>
114+
/// <param name="logon_type">The logon token's type.</param>
115+
/// <param name="groups">Optional list of additonal groups to add.</param>
116+
/// <param name="provider">The Logon provider.</param>
117+
/// <returns>The logged on token.</returns>
118+
public static NtToken GetLogonUserToken(string username, string domain, string password, SecurityLogonType logon_type,
119+
Logon32Provider provider, IEnumerable<UserGroup> groups)
103120
{
104121
switch (logon_type)
105122
{
@@ -116,11 +133,11 @@ public static NtToken GetLogonUserToken(string username, string domain, string p
116133

117134
if (groups != null)
118135
{
119-
return LogonUtils.Logon(username, domain, password, logon_type, groups);
136+
return LogonUtils.Logon(username, domain, password, logon_type, provider, groups);
120137
}
121138
else
122139
{
123-
return LogonUtils.Logon(username, domain, password, logon_type);
140+
return LogonUtils.Logon(username, domain, password, logon_type, provider);
124141
}
125142
}
126143

NtObjectManager/Cmdlets/Object/GetNtTokenCmdlet.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
using System.Runtime.InteropServices;
2323
using NtApiDotNet.Win32.Security.Authentication;
2424
using NtApiDotNet.Win32.Security.Authentication.Kerberos;
25+
using NtApiDotNet.Win32.Security.Native;
2526

2627
namespace NtObjectManager.Cmdlets.Object
2728
{
@@ -267,6 +268,12 @@ public sealed class GetNtTokenCmdlet : PSCmdlet
267268
[Parameter(Mandatory = true, ParameterSetName = "Logon")]
268269
public SwitchParameter Logon { get; set; }
269270

271+
/// <summary>
272+
/// <para type="description">Specify logon provider.</para>
273+
/// </summary>
274+
[Parameter(ParameterSetName = "Logon")]
275+
public Logon32Provider LogonProvider { get; set; }
276+
270277
/// <summary>
271278
/// <para type="description">Get an Services for User (S4U) logon token.</para>
272279
/// </summary>
@@ -579,7 +586,7 @@ private NtToken GetLogonToken(TokenAccessRights desired_access, string user,
579586
groups = AdditionalGroups.Select(s => new UserGroup(s,
580587
GetAttributes(s)));
581588
}
582-
using (NtToken token = TokenUtils.GetLogonUserToken(user, domain, password, logon_type, groups))
589+
using (NtToken token = TokenUtils.GetLogonUserToken(user, domain, password, logon_type, LogonProvider, groups))
583590
{
584591
if (desired_access == TokenAccessRights.MaximumAllowed)
585592
{

0 commit comments

Comments
 (0)