Press n or j to go to the next uncovered block, b, p or k for the previous block.
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 | 1x 1x 1x 1x | import { adsi } from '..'; import { IDirectorySearch, ColumnVal, LDAPObject } from '../../lib/adsi'; import { closeADConnection, openADConnection } from './adConnection'; import { activeDirectoryMutex } from './mutex'; export interface SPNRecord { username: string; spn: string[]; } export class SPN { constructor() {} async getListAll(): Promise<SPNRecord[]> { const adRelease = await activeDirectoryMutex.acquire(); openADConnection(); try { const root = await adsi.ADsGestObject('LDAP://rootDSE'); const distinguishedName = await root.Get('defaultNamingContext'); const dirsearch = await adsi.ADsOpenObject<IDirectorySearch>({ binding: `LDAP://${distinguishedName}`, riid: 'IID_IDirectorySearch', }); dirsearch.SetSearchPreference(); dirsearch.ExecuteSearch({ filter: '(&(objectClass=user)(objectCategory=person)(servicePrincipalName=*)(!(cn=krbtgt)))', }); const users: LDAPObject[] = []; let hr = dirsearch.GetFirstRow(); if (hr === adsi.S_ADS_NOMORE_ROWS) { throw new Error('GetFirstRow: no more rows'); } const firstRow: { [colName: string]: ColumnVal } = {}; let colName = dirsearch.GetNextColumnName(); while (colName !== adsi.S_ADS_NOMORE_COLUMNS) { const value = await dirsearch.GetColumn(colName as string); firstRow[colName] = value; colName = dirsearch.GetNextColumnName(); } users.push(firstRow); while (true) { const row: { [colName: string]: ColumnVal } = {}; hr = dirsearch.GetNextRow(); if (hr === adsi.S_ADS_NOMORE_ROWS) { break; } colName = dirsearch.GetNextColumnName(); while (colName !== adsi.S_ADS_NOMORE_COLUMNS) { const value = await dirsearch.GetColumn(colName as string); row[colName] = value; colName = dirsearch.GetNextColumnName(); } users.push(row); } dirsearch.Release(); return users.map((user) => ({ username: user.sAMAccountName[0] as string, spn: user.servicePrincipalName as string[], })); } finally { closeADConnection(); adRelease(); } } async add(): Promise<void> {} } |