< Summary

Class:SharpHoundRPC.SAMRPCNative.SAMMethods
Assembly:SharpHoundRPC
File(s):D:\a\SharpHoundCommon\SharpHoundCommon\src\SharpHoundRPC\SAMRPCNative\SAMMethods.cs
Covered lines:0
Uncovered lines:42
Coverable lines:42
Total lines:159
Line coverage:0% (0 of 42)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
SamConnect(...)100%100%
SamEnumerateDomainsInSamServer(...)100%100%
SamLookupDomainInSamServer(...)100%100%
SamOpenDomain(...)100%100%
SamGetMembersInAlias(...)100%100%
SamOpenAlias(...)100%100%
SamEnumerateAliasesInDomain(...)100%100%
SamLookupIdsInDomain(...)100%100%

File(s)

D:\a\SharpHoundCommon\SharpHoundCommon\src\SharpHoundRPC\SAMRPCNative\SAMMethods.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Runtime.InteropServices;
 4using System.Security;
 5using System.Security.Principal;
 6using SharpHoundRPC.Handles;
 7using SharpHoundRPC.Shared;
 8
 9namespace SharpHoundRPC.SAMRPCNative
 10{
 11    [SuppressUnmanagedCodeSecurity]
 12    public static class SAMMethods
 13    {
 14        internal static (NtStatus status, SAMHandle handle) SamConnect(string serverName,
 15            SAMEnums.SamAccessMasks requestedConnectAccess)
 016        {
 017            var us = new SharedStructs.UnicodeString(serverName);
 018            var objectAttributes = default(SAMStructs.ObjectAttributes);
 19
 020            var status = SamConnect(ref us, out var handle, requestedConnectAccess, ref objectAttributes);
 021            objectAttributes.Dispose();
 22
 023            return (status, handle);
 024        }
 25
 26        [DllImport("samlib.dll", CharSet = CharSet.Unicode)]
 27        private static extern NtStatus SamConnect(
 28            ref SharedStructs.UnicodeString serverName,
 29            out SAMHandle serverHandle,
 30            SAMEnums.SamAccessMasks desiredAccess,
 31            ref SAMStructs.ObjectAttributes objectAttributes
 32        );
 33
 34        internal static (NtStatus status, SAMPointer domainRids, int count)
 35            SamEnumerateDomainsInSamServer(SAMHandle serverHandle)
 036        {
 037            var enumerationContext = 0;
 038            var status =
 039                SamEnumerateDomainsInSamServer(serverHandle, ref enumerationContext, out var domains, -1,
 040                    out var count);
 41
 042            return (status, domains, count);
 043        }
 44
 45        [DllImport("samlib.dll", CharSet = CharSet.Unicode)]
 46        private static extern NtStatus SamEnumerateDomainsInSamServer(
 47            SAMHandle serverHandle,
 48            ref int enumerationContext,
 49            out SAMPointer buffer,
 50            int prefMaxLen,
 51            out int count
 52        );
 53
 54        internal static (NtStatus status, SAMPointer securityIdentifier) SamLookupDomainInSamServer(
 55            SAMHandle serverHandle, string name)
 056        {
 057            var us = new SharedStructs.UnicodeString(name);
 058            var status = SamLookupDomainInSamServer(serverHandle, ref us, out var sid);
 59
 060            return (status, sid);
 061        }
 62
 63        [DllImport("samlib.dll", CharSet = CharSet.Unicode)]
 64        private static extern NtStatus SamLookupDomainInSamServer(
 65            SAMHandle serverHandle,
 66            ref SharedStructs.UnicodeString name,
 67            out SAMPointer sid);
 68
 69        internal static (NtStatus status, SAMHandle domainHandle) SamOpenDomain(SAMHandle serverHandle,
 70            SAMEnums.DomainAccessMask desiredAccess, byte[] domainSid)
 071        {
 072            var status = SamOpenDomain(serverHandle, desiredAccess, domainSid, out var domainHandle);
 073            return (status, domainHandle);
 074        }
 75
 76        [DllImport("samlib.dll", CharSet = CharSet.Unicode)]
 77        private static extern NtStatus SamOpenDomain(
 78            SAMHandle serverHandle,
 79            SAMEnums.DomainAccessMask desiredAccess,
 80            [MarshalAs(UnmanagedType.LPArray)] byte[] domainSid,
 81            out SAMHandle domainHandle
 82        );
 83
 84        internal static (NtStatus status, SAMSidArray members, int count) SamGetMembersInAlias(SAMHandle aliasHandle)
 085        {
 086            var status = SamGetMembersInAlias(aliasHandle, out var members, out var count);
 087            return (status, members, count);
 088        }
 89
 90        [DllImport("samlib.dll", CharSet = CharSet.Unicode)]
 91        private static extern NtStatus SamGetMembersInAlias(
 92            SAMHandle aliasHandle,
 93            out SAMSidArray members,
 94            out int count
 95        );
 96
 97        internal static (NtStatus status, SAMHandle aliasHandle) SamOpenAlias(SAMHandle domainHandle,
 98            SAMEnums.AliasOpenFlags desiredAccess, int aliasId)
 099        {
 0100            var status = SamOpenAlias(domainHandle, desiredAccess, aliasId, out var aliasHandle);
 0101            return (status, aliasHandle);
 0102        }
 103
 104        [DllImport("samlib.dll", CharSet = CharSet.Unicode)]
 105        private static extern NtStatus SamOpenAlias(
 106            SAMHandle domainHandle,
 107            SAMEnums.AliasOpenFlags desiredAccess,
 108            int aliasId,
 109            out SAMHandle aliasHandle
 110        );
 111
 112        internal static (NtStatus status, SAMPointer pointer, int count) SamEnumerateAliasesInDomain(
 113            SAMHandle domainHandle)
 0114        {
 0115            var enumerationContext = 0;
 0116            var status = SamEnumerateAliasesInDomain(domainHandle, ref enumerationContext, out var buffer, -1,
 0117                out var count);
 0118            return (status, buffer, count);
 0119        }
 120
 121        [DllImport("samlib.dll", CharSet = CharSet.Unicode)]
 122        private static extern NtStatus SamEnumerateAliasesInDomain(
 123            SAMHandle domainHandle,
 124            ref int enumerationContext,
 125            out SAMPointer buffer,
 126            int prefMaxLen,
 127            out int count
 128        );
 129
 130        internal static (NtStatus status, SAMPointer names, SAMPointer use) SamLookupIdsInDomain(SAMHandle domainHandle,
 131            int rid)
 0132        {
 0133            var rids = new[] {rid};
 0134            var status = SamLookupIdsInDomain(domainHandle, 1, rids, out var names, out var use);
 0135            return (status, names, use);
 0136        }
 137
 138        [DllImport("samlib.dll", CharSet = CharSet.Unicode)]
 139        private static extern NtStatus SamLookupIdsInDomain(SAMHandle domainHandle,
 140            int count,
 141            int[] rids,
 142            out SAMPointer names,
 143            out SAMPointer use);
 144
 145        #region Cleanup
 146
 147        [DllImport("samlib.dll")]
 148        internal static extern NtStatus SamFreeMemory(
 149            IntPtr handle
 150        );
 151
 152        [DllImport("samlib.dll")]
 153        internal static extern NtStatus SamCloseHandle(
 154            IntPtr handle
 155        );
 156
 157        #endregion
 158    }
 159}