
Golang में ADWS के लिए एक व्यावहारिक क्लाइंट।
Golang में ADWS के लिए एक व्यावहारिक क्लाइंट।
Sopa, ADWS प्रोटोकॉल स्टैक (MS-NNS + MC-NMF + SOAP) को लागू करता है, जो निम्नलिखित कमांड-लाइन सुविधाएँ प्रदान करता है:
query: WS-Enumeration Enumerate + Pull लूप के माध्यम से LDAP-फ़िल्टर खोज चलाता है जिसमें एट्रीब्यूट प्रोजेक्शन, स्कोप नियंत्रण (Base/OneLevel/Subtree), और पेजिनेशन होता हैget: WS-Transfer Get के माध्यम से DN द्वारा एक एकल ऑब्जेक्ट प्राप्त करता हैcreate: WS-Transfer ResourceFactory के माध्यम से ऑब्जेक्ट बनाता है (अंतर्निहित प्रकार: user, computer, group, OU, container; या IMDA AddRequest के माध्यम से YAML टेम्पलेट से कस्टम ऑब्जेक्ट)delete: WS-Transfer Delete के माध्यम से DN द्वारा किसी ऑब्जेक्ट को हटाता हैattr: WS-Transfer Put के माध्यम से किसी मौजूदा ऑब्जेक्ट पर व्यक्तिगत एट्रीब्यूट मान जोड़ता है, बदलता है, या हटाता हैset-password: MS-ADCAP SetPassword के माध्यम से खाता पासवर्ड सेट करता हैchange-password: MS-ADCAP ChangePassword के माध्यम से खाता पासवर्ड बदलता है (पुराने पासवर्ड की आवश्यकता है)translate-name: TranslateName के माध्यम से DN और कैनोनिकल नाम प्रारूपों के बीच रूपांतरण करता हैgroups: GetADPrincipalGroupMembership / GetADPrincipalAuthorizationGroup के माध्यम से किसी प्रिंसिपल की समूह सदस्यता या प्राधिकरण समूहों को सूचीबद्ध करता हैmembers: GetADGroupMember के माध्यम से समूह सदस्यों को (वैकल्पिक रूप से पुनरावर्ती) गणना करता हैoptfeature: ChangeOptionalFeature के माध्यम से वैकल्पिक AD सुविधाओं (जैसे Recycle Bin) को टॉगल करता हैinfo: GetVersion, GetADDomain, GetADForest, GetADDomainControllers के माध्यम से टोपोलॉजी मेटाडेटा (संस्करण, डोमेन, फ़ॉरेस्ट, DC सूची) प्राप्त करता हैmex: एक अप्रमाणित WS-MetadataExchange अनुरोध के माध्यम से ADWS सेवा एंडपॉइंट मेटाडेटा प्राप्त करता है$ go install github.com/Macmod/sopa/cmd/sopa@latest
# Auth flags (-u, -p, -d, -k, -H, -c, ...) are omitted for brevity - see Authentication section.
# Search objects by LDAP filter
$ sopa [auth_flags] query --dc <DC> --filter '(objectClass=*)'
# Fetch a single object by DN
$ sopa [auth_flags] get --dc <DC> --dn '<DN>'
# Delete an object by DN
$ sopa [auth_flags] delete --dc <DC> --dn '<DN>'
# Edit attribute values
$ sopa [auth_flags] attr add --dc <DC> --dn '<DN>' --attr <ATTR> --value <VALUE>
$ sopa [auth_flags] attr replace --dc <DC> --dn '<DN>' --attr <ATTR> --value <VALUE>
$ sopa [auth_flags] attr delete --dc <DC> --dn '<DN>' --attr <ATTR>
# Create objects
$ sopa [auth_flags] create user --dc <DC> --name <CN> --pass <INITIAL_PASS>
$ sopa [auth_flags] create computer --dc <DC> --name <CN>
$ sopa [auth_flags] create group --dc <DC> --name <CN> --type GlobalSecurity
$ sopa [auth_flags] create ou --dc <DC> --name <CN>
$ sopa [auth_flags] create container --dc <DC> --name <CN>
$ sopa [auth_flags] create custom --dc <DC> --template <TEMPLATE.yaml>
# Set / change account passwords (MS-ADCAP)
$ sopa [auth_flags] set-password --dc <DC> --dn '<DN>' --new <NEW_PASS>
$ sopa [auth_flags] change-password --dc <DC> --dn '<DN>' --old <OLD_PASS> --new <NEW_PASS>
# Translate DN <-> canonical name (MS-ADCAP)
# (this call is mostly useless but kept for completeness 😄)
$ sopa [auth_flags] translate-name --dc <DC> --offered DistinguishedName --desired CanonicalName '<DN>'
# Principal group memberships (MS-ADCAP)
$ sopa [auth_flags] groups --dc <DC> --dn '<DN>' --membership --authz
# Group members (MS-ADCAP)
$ sopa [auth_flags] members --dc <DC> --dn '<GROUP_DN>' --recursive
# Toggle optional AD feature, e.g. Recycle Bin (MS-ADCAP)
$ sopa [auth_flags] optfeature --dc <DC> --feature-id <FEATURE_GUID> --enable
# Topology info (MS-ADCAP)
$ sopa [auth_flags] info version --dc <DC>
$ sopa [auth_flags] info domain --dc <DC>
$ sopa [auth_flags] info forest --dc <DC>
$ sopa [auth_flags] info dcs --dc <DC>
# ADWS service endpoint metadata (unauthenticated - auth flags not needed)
$ sopa mex --dc <DC>
बिना किसी उप-कमांड के sopa चलाने पर एक इंटरैक्टिव शेल खुलता है। यह सभी कमांड के लिए एक ही कनेक्शन का पुन: उपयोग करता है और टैब-पूर्णता प्रदान करता है।
$ sopa --dc <DC> -u <USER> -p <PASS> -d <DOMAIN>
sopa v1.1.0
Connected dc.corp.local domain=corp.local user=Administrator
Type 'help' for commands or 'exit' to quit.
[corp.local]> query --filter '(objectClass=user)' --attrs sAMAccountName
[corp.local]> get --dn 'CN=Administrator,CN=Users,DC=corp,DC=local'
[corp.local]> exit
शेल से बाहर निकलने के लिए exit, quit, या Ctrl-D का उपयोग करें।
उदाहरण टेम्पलेट: examples/custom-create.example.yaml
टेम्पलेट स्कीमा (YAML):
parentDN (स्ट्रिंग, आवश्यक): कंटेनर DNrdn (स्ट्रिंग, आवश्यक): नए ऑब्जेक्ट के लिए सापेक्ष DN (जैसे CN=Foo)attributes (सूची, आवश्यक): प्रत्येक आइटम में होता है:
name (स्ट्रिंग, आवश्यक): एट्रीब्यूट नाम (cn या addata:cn)type (स्ट्रिंग, वैकल्पिक): string|int|bool|base64|hex (या स्पष्ट xsd:*), डिफ़ॉल्ट stringvalue (स्ट्रिंग) या values (स्ट्रिंग्स की सूची)नोट:
ad:relativeDistinguishedName या ad:container-hierarchy-parent शामिल न करें (वे स्वचालित रूप से इंजेक्ट होते हैं)।hex मान xsd:base64Binary में परिवर्तित होते हैं।value: "" का उपयोग करें।--dc एक FQDN, एक IP पता स्वीकार करता है, या छोड़ा जा सकता है.
चूंकि DC का होस्टनाम कभी-कभी नेटवर्क के डिफ़ॉल्ट DNS से उपलब्ध नहीं होता, इसलिए हमेशा --dns <DC-IP> पास करने की दृढ़ता से अनुशंसा की जाती है ताकि sopa सभी लुकअप के लिए DC के अपने DNS सर्वर का उपयोग करे:
# Option 1: let sopa resolve everything through the DC's DNS
$ sopa query --dns 192.168.1.10 -d corp.local -u user -p pass --filter '(objectClass=user)'
जब --dc छोड़ दिया जाता है और --domain प्रदान किया जाता है, sopa SRV रिकॉर्ड क्वेरी करके स्वचालित रूप से एक DC खोजता है:
_ldap._tcp.<domain> (पहले प्रयास किया गया)
_kerberos._tcp.<domain> (फ़ॉलबैक)
उच्चतम-प्राथमिकता वाले रिकॉर्ड का लक्ष्य उपयोग किया जाता है। इसके लिए आवश्यक है कि --dns द्वारा इंगित DNS सर्वर उन SRV प्रश्नों का उत्तर दे सके - DC का अपना एकीकृत DNS सर्वर (जब मौजूद हो) ऐसा करने में सक्षम होना चाहिए।
# Option 2: provide DC explicitly without Kerberos
$ sopa info version --dc 192.168.1.10 --domain corp.local -u user -p pass