internal static NtStatus SamConnect(string serverName, out SafeSamHandle serverHandle, SamServerAccessMask accessMask) { IntPtr objectAttributes = IntPtr.Zero; UnicodeString unicodeServerName = new UnicodeString(serverName); return(SamConnect(ref unicodeServerName, out serverHandle, accessMask, objectAttributes)); }
public void ReleaseHandle() { if (this.Handle != null) { this.Handle.Dispose(); this.Handle = null; } }
/// <summary> /// The SamQueryInformationDomain method obtains attributes from a domain object. /// </summary> /// <param name="domainHandle">An RPC context handle, representing a domain object.</param> /// <param name="domainPasswordInformation">The requested attributes on output.</param> internal static NtStatus SamQueryInformationDomain(SafeSamHandle domainHandle, out SamDomainPasswordInformation domainPasswordInformation) { SafeSamPointer buffer; NtStatus result = SamQueryInformationDomain(domainHandle, SamDomainInformationClass.PasswordInformation, out buffer); domainPasswordInformation = buffer != null?Marshal.PtrToStructure <SamDomainPasswordInformation>(buffer.DangerousGetHandle()) : new SamDomainPasswordInformation(); return(result); }
internal static NtStatus SamLookupDomainInSamServer(SafeSamHandle serverHandle, string domainName, out SecurityIdentifier domainSid) { UnicodeString unicodeDomainName = new UnicodeString(domainName); byte[] domainIdBinary; NtStatus result = SamLookupDomainInSamServer(serverHandle, ref unicodeDomainName, out domainIdBinary); if (domainIdBinary != null) { domainSid = new SecurityIdentifier(domainIdBinary, 0); } else { domainSid = null; } return(result); }
internal static NtStatus SamLookupNameInDomain(SafeSamHandle domainHandle, string name, out int relativeId, out SamSidType sidType) { string[] names = new string[] { name }; int[] relativeIds; SamSidType[] use; NtStatus result = SamLookupNamesInDomain(domainHandle, names, out relativeIds, out use); if (result == NtStatus.Success) { relativeId = relativeIds[0]; sidType = use[0]; } else { relativeId = -1; sidType = SamSidType.Unknown; } return(result); }
internal static NtStatus SamConnectWithCreds(string serverName, out SafeSamHandle serverHandle, SamServerAccessMask accessMask, SafeRpcAuthIdentityHandle authIdentity) { uint unknown = 0; IntPtr objectAttributes = IntPtr.Zero; UnicodeString unicodeServerName = new UnicodeString(serverName); string servicePrincipalName = spnPrefix + serverName; NtStatus result = SamConnectWithCreds(ref unicodeServerName, out serverHandle, accessMask, objectAttributes, authIdentity, servicePrincipalName, out unknown); if (result == NtStatus.RpcUnknownAuthenticationService) { // Try it again, but without the SPN servicePrincipalName = null; return(SamConnectWithCreds(ref unicodeServerName, out serverHandle, accessMask, objectAttributes, authIdentity, servicePrincipalName, out unknown)); } else { return(result); } }
internal static NtStatus SamLookupNamesInDomain(SafeSamHandle domainHandle, string[] names, out int[] relativeIds, out SamSidType[] use) { Validator.AssertNotNull(names, "names"); int count = names.Length; if (count > 1000) { // TODO: Extract as resource throw new ArgumentOutOfRangeException("names", count, "Cannot translate more than 1000 names at once."); } // Prepare parameters UnicodeString[] unicodeNames = new UnicodeString[count]; for (int i = 0; i < count; i++) { unicodeNames[i] = new UnicodeString(names[i]); } // TODO: SamFreeMemory // Call the native function return(SamLookupNamesInDomain(domainHandle, count, unicodeNames, out relativeIds, out use)); }
internal static NtStatus SamLookupNamesInDomain(SafeSamHandle domainHandle, string[] names, out int[] relativeIds, out SamSidType[] use) { Validator.AssertNotNull(names, "names"); int count = names.Length; if (count > MaxNamesToLookup) { // TODO: Extract as resource throw new ArgumentOutOfRangeException("names", count, "Cannot translate more than 1000 names at once."); } // Prepare parameters SafeSamPointer relativeIdsPointer; SafeSamPointer usePointer; UnicodeString[] unicodeNames = new UnicodeString[count]; for (int i = 0; i < count; i++) { unicodeNames[i] = new UnicodeString(names[i]); } // Call the native function NtStatus result = SamLookupNamesInDomain(domainHandle, count, unicodeNames, out relativeIdsPointer, out usePointer); if (result == NtStatus.Success) { // Marshal pointers into arrays relativeIds = new int[count]; use = new SamSidType[count]; Marshal.Copy(relativeIdsPointer.DangerousGetHandle(), relativeIds, 0, count); Marshal.Copy(usePointer.DangerousGetHandle(), (int[])(object)use, 0, count); } else { relativeIds = null; use = null; } return(result); }
private static extern NtStatus SamLookupNamesInDomain(SafeSamHandle domainHandle, int count, UnicodeString[] names, out SafeSamPointer relativeIds, out SafeSamPointer use);
private static extern NtStatus SamOpenDomain(SafeSamHandle serverHandle, SamDomainAccessMask desiredAccess, [MarshalAs(UnmanagedType.LPArray)] byte[] domainId, out SafeSamHandle domainHandle);
private static extern NtStatus SamQueryInformationDomain(SafeSamHandle domainHandle, SamDomainInformationClass domainInformationClass, out SafeSamPointer buffer);
internal SamUser(SafeSamHandle handle) : base(handle) { }
internal SamDomain(SafeSamHandle handle) : base(handle) { }
protected SamObject(SafeSamHandle handle) { this.Handle = handle; }
internal static NtStatus SamSetInformationUser(SafeSamHandle userHandle, ref SamUserInternal1Information passwordInformation) { return(SamSetInformationUser(userHandle, SamUserInformationClass.Internal1Information, ref passwordInformation)); }
private static extern NtStatus SamConnect([In] ref UnicodeString serverName, out SafeSamHandle serverHandle, SamServerAccessMask accessMask, IntPtr objectAttributes);
internal static extern NtStatus SamOpenUser(SafeSamHandle domainHandle, SamUserAccessMask desiredAccess, int userId, out SafeSamHandle userHandle);
private static extern NtStatus SamConnectWithCreds([In] ref UnicodeString serverName, out SafeSamHandle serverHandle, SamServerAccessMask accessMask, IntPtr objectAttributes, SafeRpcAuthIdentityHandle authIdentity, [MarshalAs(UnmanagedType.LPWStr)] string servicePrincipalName, out uint unknown);
private static extern NtStatus SamSetInformationUser(SafeSamHandle userHandle, SamUserInformationClass userInformationClass, [In] ref SamUserInternal1Information buffer);
internal static extern NtStatus SamEnumerateDomainsInSamServer(SafeSamHandle serverHandle, ref uint enumerationContext, out SafeSamEnumerationBufferPointer buffer, uint preferedMaximumLength, out uint countReturned);
private static extern NtStatus SamLookupDomainInSamServer(SafeSamHandle serverHandle, [In] ref UnicodeString domainName, [MarshalAs(UnmanagedType.LPArray, SizeConst = 24)] out byte[] domainId);
internal static NtStatus SamOpenDomain(SafeSamHandle serverHandle, SamDomainAccessMask desiredAccess, SecurityIdentifier domainSid, out SafeSamHandle domainHandle) { byte[] binarySid = domainSid.GetBinaryForm(); return(SamOpenDomain(serverHandle, desiredAccess, binarySid, out domainHandle)); }
private static extern NtStatus SamLookupNamesInDomain(SafeSamHandle domainHandle, int count, UnicodeString[] names, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] out int[] relativeIds, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] out SamSidType[] use);