通过使用ldapsearch的objectSid获取SID

我有由ldapsearch命令返回的objectSid属性,我怎样才能以它可读的格式生成SID

ldapsearch命令:

ldapsearch -LLL -H ldap://dc.example.com:389 -b dc=example,dc=lk -D example\administrator -w adminPassword "(sAMAccountName=bob)" | grep -i "objectSid::" | cut -d ":" -f3 | xargs 

该命令返回AD用户“bob”的objectSid。 假设它将objectSid返回为:

AQUAAAAAAAUVAAAAPWW1S5rojK4mDAiG5BAAAA ==

我想用以下格式生成它的SID:

S-1-5-21-1270179133-2928470170-2248674342-4324

有没有可能在Linux中做到这一点?

参考: 使用ldapsearch通过objectGUID获取对象

首先,您可以通过在filter后包含您想要的属性来限制ldapsearch查询返回的答案集,当您瞄准多个结果时应该更快一些。

  ldapsearch -LLL -H ldap://dc.example.com:389 -b dc=example,dc=lk -D example\administrator -w adminPassword "(sAMAccountName=bob)" ObjectSID 

其次,当一个属性与它的值被双冒号“ ::分开时,表明这个值是base64编码的 。 ldapsearch不是模式感知的,它不知道这样一个base64编码的归属是一个unicode文本string,可以显示为一个unicodeterminal的文本或例如jpegPhoto或其他一些不能轻易显示在一个数据terminal,并不会为您解码这些值。

 echo AQUAAAAAAAUVAAAAPWW1S5rojK4mDAiG5BAAAA== | base64 --decode 

应该做的伎俩。 AFAIK base64应该在coreutils包中。


问题是base64解码后的objectSid仍然是一个二进制值 ,需要进一步转换才能显示在S-1-5-21-1270179133-2928470170-2248674342-4324的常规安全标识符格式中。

你需要用你select的脚本/编程语言编写一个转换例程,例如其他人已经在perl或php中做了例子。

最后,我设法从ObjectSid构造SID。 如果有人感兴趣,这里是完整的shell脚本。

 #!/bin/bash # Base-64 encoded objectSid OBJECT_ID="AQUAAAAAAAUVAAAAPWW1S5rojK4mDAiG5BAAAA==" # Decode it, hex-dump it and store it in an array G=($(echo -n $OBJECT_ID | base64 -d -i | hexdump -v -e '1/1 " %02X"')) # SID in HEX # SID_HEX=${G[0]}-${G[1]}-${G[2]}${G[3]}${G[4]}${G[5]}${G[6]}${G[7]}-${G[8]}${G[9]}${G[10]}${G[11]}-${G[12]}${G[13]}${G[14]}${G[15]}-${G[16]}${G[17]}${G[18]}${G[19]}-${G[20]}${G[21]}${G[22]}${G[23]}-${G[24]}${G[25]}${G[26]}${G[27]}${G[28]} # SID Structure: https://technet.microsoft.com/en-us/library/cc962011.aspx # LESA = Little Endian Sub Authority # BESA = Big Endian Sub Authority # LERID = Little Endian Relative ID # BERID = Big Endian Relative ID BESA2=${G[8]}${G[9]}${G[10]}${G[11]} BESA3=${G[12]}${G[13]}${G[14]}${G[15]} BESA4=${G[16]}${G[17]}${G[18]}${G[19]} BESA5=${G[20]}${G[21]}${G[22]}${G[23]} BERID=${G[24]}${G[25]}${G[26]}${G[27]}${G[28]} LESA1=${G[2]}${G[3]}${G[4]}${G[5]}${G[6]}${G[7]} LESA2=${BESA2:6:2}${BESA2:4:2}${BESA2:2:2}${BESA2:0:2} LESA3=${BESA3:6:2}${BESA3:4:2}${BESA3:2:2}${BESA3:0:2} LESA4=${BESA4:6:2}${BESA4:4:2}${BESA4:2:2}${BESA4:0:2} LESA5=${BESA5:6:2}${BESA5:4:2}${BESA5:2:2}${BESA5:0:2} LERID=${BERID:6:2}${BERID:4:2}${BERID:2:2}${BERID:0:2} LE_SID_HEX=${LESA1}-${LESA2}-${LESA3}-${LESA4}-${LESA5}-${LERID} # Initial SID value which is used to construct actual SID SID="S-1" # Convert LE_SID_HEX to decimal values and append it to SID as a string IFS='-' read -ra ADDR <<< "${LE_SID_HEX}" for OBJECT in "${ADDR[@]}"; do SID=${SID}-$((16#${OBJECT})) done echo ${SID}