smbRpc 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +11 -0
  3. data/examples/enumLsa.rb +44 -0
  4. data/examples/enumSmbPipe.rb +16 -0
  5. data/lib/smbRpc.rb +33 -0
  6. data/lib/smbRpc/epmapper.rb +13 -0
  7. data/lib/smbRpc/epmapper/constants.rb +28 -0
  8. data/lib/smbRpc/epmapper/epmLookup.rb +98 -0
  9. data/lib/smbRpc/lsarpc.rb +22 -0
  10. data/lib/smbRpc/lsarpc/close.rb +48 -0
  11. data/lib/smbRpc/lsarpc/constants.rb +54 -0
  12. data/lib/smbRpc/lsarpc/enumerateAccounts.rb +55 -0
  13. data/lib/smbRpc/lsarpc/enumeratePrivilegesAccount.rb +49 -0
  14. data/lib/smbRpc/lsarpc/lookupNames.rb +74 -0
  15. data/lib/smbRpc/lsarpc/lookupPrivilegeName.rb +37 -0
  16. data/lib/smbRpc/lsarpc/lookupSids.rb +96 -0
  17. data/lib/smbRpc/lsarpc/openAccount.rb +49 -0
  18. data/lib/smbRpc/lsarpc/openPolicy.rb +52 -0
  19. data/lib/smbRpc/lsarpc/queryInformationPolicy.rb +92 -0
  20. data/lib/smbRpc/lsarpc/querySecurityObject.rb +75 -0
  21. data/lib/smbRpc/rpc.rb +5 -0
  22. data/lib/smbRpc/rpc/connection.rb +34 -0
  23. data/lib/smbRpc/rpc/constants.rb +64 -0
  24. data/lib/smbRpc/rpc/endpoints.rb +38 -0
  25. data/lib/smbRpc/rpc/ndrep.rb +24 -0
  26. data/lib/smbRpc/rpc/pdu.rb +40 -0
  27. data/lib/smbRpc/samr.rb +40 -0
  28. data/lib/smbRpc/samr/addMemberToAlias.rb +43 -0
  29. data/lib/smbRpc/samr/addMemberToGroup.rb +36 -0
  30. data/lib/smbRpc/samr/changePasswordUser.rb +64 -0
  31. data/lib/smbRpc/samr/closeHandle.rb +50 -0
  32. data/lib/smbRpc/samr/connect.rb +46 -0
  33. data/lib/smbRpc/samr/constants.rb +114 -0
  34. data/lib/smbRpc/samr/createAliasInDomain.rb +45 -0
  35. data/lib/smbRpc/samr/createGroupInDomain.rb +46 -0
  36. data/lib/smbRpc/samr/createUserInDomain.rb +48 -0
  37. data/lib/smbRpc/samr/deleteAlias.rb +35 -0
  38. data/lib/smbRpc/samr/deleteGroup.rb +35 -0
  39. data/lib/smbRpc/samr/deleteUser.rb +35 -0
  40. data/lib/smbRpc/samr/enumerateAliasesInDomain.rb +61 -0
  41. data/lib/smbRpc/samr/enumerateDomainsInSamServer.rb +52 -0
  42. data/lib/smbRpc/samr/enumerateGroupsInDomain.rb +60 -0
  43. data/lib/smbRpc/samr/enumerateUsersInDomain.rb +67 -0
  44. data/lib/smbRpc/samr/getMembersInAlias.rb +41 -0
  45. data/lib/smbRpc/samr/getMembersInGroup.rb +45 -0
  46. data/lib/smbRpc/samr/lookupDomainInSamServer.rb +41 -0
  47. data/lib/smbRpc/samr/lookupIdsInDomain.rb +52 -0
  48. data/lib/smbRpc/samr/lookupNamesInDomain.rb +55 -0
  49. data/lib/smbRpc/samr/openAlias.rb +39 -0
  50. data/lib/smbRpc/samr/openDomain.rb +48 -0
  51. data/lib/smbRpc/samr/openGroup.rb +39 -0
  52. data/lib/smbRpc/samr/openUser.rb +39 -0
  53. data/lib/smbRpc/samr/queryInformationUser.rb +182 -0
  54. data/lib/smbRpc/samr/removeMemberFromAlias.rb +43 -0
  55. data/lib/smbRpc/samr/removeMemberFromGroup.rb +34 -0
  56. data/lib/smbRpc/samr/setInformationUser.rb +53 -0
  57. data/lib/smbRpc/srvsvc.rb +12 -0
  58. data/lib/smbRpc/srvsvc/netShareEnum.rb +104 -0
  59. data/lib/smbRpc/srvsvc/serverGetInfo.rb +57 -0
  60. data/lib/smbRpc/svcctl.rb +20 -0
  61. data/lib/smbRpc/svcctl/closeService.rb +48 -0
  62. data/lib/smbRpc/svcctl/constants.rb +88 -0
  63. data/lib/smbRpc/svcctl/controlService.rb +48 -0
  64. data/lib/smbRpc/svcctl/createService.rb +68 -0
  65. data/lib/smbRpc/svcctl/deleteService.rb +31 -0
  66. data/lib/smbRpc/svcctl/enumServicesStatus.rb +96 -0
  67. data/lib/smbRpc/svcctl/openScm.rb +37 -0
  68. data/lib/smbRpc/svcctl/openService.rb +36 -0
  69. data/lib/smbRpc/svcctl/queryServiceConfig.rb +67 -0
  70. data/lib/smbRpc/svcctl/startService.rb +35 -0
  71. data/lib/smbRpc/updateRuby_smb.rb +3 -0
  72. data/lib/smbRpc/updateRuby_smb/client.rb +29 -0
  73. data/lib/smbRpc/updateRuby_smb/dcerpc.rb +30 -0
  74. data/lib/smbRpc/updateRuby_smb/ioctl_request.rb +53 -0
  75. data/lib/smbRpc/updateString.rb +3 -0
  76. data/lib/smbRpc/updateString/raise_not_error_success.rb +11 -0
  77. data/lib/smbRpc/updateString/to_des_ecb_lm.rb +34 -0
  78. data/smbRpc.gemspec +16 -0
  79. metadata +148 -0
@@ -0,0 +1,49 @@
1
+ module SmbRpc
2
+ class Lsarpc < Rpc
3
+
4
+ class LsarEnumeratePrivilegesAccountReq < BinData::Record
5
+ endian :little
6
+ request :request
7
+ string :accountHandle, :length => 20
8
+
9
+ def initialize_instance
10
+ super
11
+ accountHandle.value = get_parameter(:handle)
12
+ request.pduHead.frag_length = self.num_bytes
13
+ request.opnum.value = 18 #LsarEnumeratePrivilegesAccount
14
+ end
15
+ end
16
+
17
+ class Lsapr_luid_and_attributes < BinData::Record
18
+ endian :little
19
+ string :luid, :length => 8
20
+ uint32 :attributes #2.2.5.4 LSAPR_LUID_AND_ATTRIBUTES
21
+ #bit maks of last 2 least significant bit, so 1 = emable by default, 2 = enable
22
+ end
23
+
24
+ class Lsapr_privilege_set < BinData::Record
25
+ endian :little
26
+ uint32 :privilegeCount
27
+ uint32 :numberOfPrivilegeCount
28
+ uint32 :control
29
+ array :privilege, :type => :lsapr_luid_and_attributes, :initial_length => :privilegeCount
30
+ end
31
+
32
+ class LsarEnumeratePrivilegesAccountRes < BinData::Record
33
+ endian :little
34
+ response :response
35
+ uint32 :ref_id_privileges
36
+ lsapr_privilege_set :privileges
37
+ uint32 :windowsError
38
+ end
39
+
40
+ def enumeratePrivilegesAccount()
41
+ lsarEnumeratePrivilegesAccountReq = LsarEnumeratePrivilegesAccountReq.new(handle:@accountHandle)
42
+ lsarEnumeratePrivilegesAccountRes = @file.ioctl_send_recv(lsarEnumeratePrivilegesAccountReq).buffer
43
+ lsarEnumeratePrivilegesAccountRes.raise_not_error_success("enumeratePrivilegesAccount")
44
+ lsarEnumeratePrivilegesAccountRes = LsarEnumeratePrivilegesAccountRes.read(lsarEnumeratePrivilegesAccountRes)
45
+ return lsarEnumeratePrivilegesAccountRes.privileges.privilege
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,74 @@
1
+ module SmbRpc
2
+ class Lsarpc < Rpc
3
+
4
+ class Lsapr_translated_sids < BinData::Record
5
+ endian :little
6
+ uint32 :numberOfEntries
7
+ choice :sids, :selection => :numberOfEntries do
8
+ uint32 0
9
+ array :default, :type => :rpc_sid, :initial_length => :numberOfEntries
10
+ end
11
+ end
12
+
13
+ class LsarLookupNamesReq < BinData::Record
14
+ endian :little
15
+ request :request
16
+ string :policyHandle, :length => 20
17
+ uint32 :numCount, :value => 1
18
+ uint32 :numberOfNames, :value => :numCount
19
+ rpc_unicode_string :name
20
+ conformantandVaryingStrings :nameNdr
21
+ lsapr_translated_sids :translatedSids
22
+ uint32 :lookupLevel, :value => 1
23
+ uint32 :mappedCount
24
+
25
+ def initialize_instance
26
+ super
27
+ policyHandle.value = get_parameter(:handle)
28
+ uniString = get_parameter(:accountName).bytes.pack("v*")
29
+ name.len.value = uniString.bytesize
30
+ name.maximumLength.value = uniString.bytesize
31
+ nameNdr.str.value = uniString
32
+
33
+ request.pduHead.frag_length = self.num_bytes
34
+ request.opnum.value = 14 #LsarLookupNames
35
+ end
36
+ end
37
+
38
+ class Lsa_translated_sid < BinData::Record
39
+ endian :little
40
+ uint32 :use
41
+ uint32 :relativeId
42
+ uint32 :domainIndex
43
+ end
44
+
45
+ class LsarLookupNamesRes < BinData::Record
46
+ endian :little
47
+ response :response
48
+ uint32 :ref_id_referencedDomains
49
+ lsapr_referenced_domain_list :referencedDomains #already declared in lsarpc/lsaLookupSids.rb
50
+ uint32 :numberOfEntries
51
+ lsapr_trust_information :domain #already declared in lsarpc/lsaLookupSids.rb
52
+ uint32 :numberOfSids
53
+ uint32 :ref_id_translatedSids
54
+ uint32 :numberOfTranslatedSids
55
+ lsa_translated_sid :translatedSids
56
+ uint32 :mappedCount
57
+ uint32 :windowsError
58
+ end
59
+
60
+ def lookupNames(name:)
61
+ lsarLookupNamesReq = LsarLookupNamesReq.new(handle:@policyHandle, accountName:name)
62
+ lsarLookupNamesRes = @file.ioctl_send_recv(lsarLookupNamesReq).buffer
63
+ lsarLookupNamesRes.raise_not_error_success("lookupNames")
64
+ lsarLookupNamesRes = LsarLookupNamesRes.read(lsarLookupNamesRes)
65
+ h = {}
66
+ h[:domain] = lsarLookupNamesRes.domain.name.str.unpack("v*").pack("c*")
67
+ h[:sid] = lsarLookupNamesRes.domain.sid.sid.to_s
68
+ h[:rid] = lsarLookupNamesRes.translatedSids.relativeId.to_i
69
+ h[:type] = lsarLookupNamesRes.translatedSids.use.to_i
70
+ return h
71
+ end
72
+
73
+ end
74
+ end
@@ -0,0 +1,37 @@
1
+ module SmbRpc
2
+ class Lsarpc < Rpc
3
+
4
+ class LsarLookupPrivilegeNameReq < BinData::Record
5
+ endian :little
6
+ request :request
7
+ string :policyHandle, :length => 20
8
+ string :luid, :length => 8
9
+
10
+ def initialize_instance
11
+ super
12
+ policyHandle.value = get_parameter(:handle)
13
+ luid.value = get_parameter(:lu)
14
+ request.pduHead.frag_length = self.num_bytes
15
+ request.opnum.value = 32 #LsarLookupPrivilegeName
16
+ end
17
+ end
18
+
19
+ class LsarLookupPrivilegeNameRes < BinData::Record
20
+ endian :little
21
+ response :response
22
+ uint32 :ref_id_name
23
+ rpc_unicode_string :name
24
+ conformantandVaryingStrings :nameNdr
25
+ uint32 :windowsError
26
+ end
27
+
28
+ def lookupPrivilegeName(luid:)
29
+ lsarLookupPrivilegeNameReq = LsarLookupPrivilegeNameReq.new(handle:@policyHandle, lu:luid)
30
+ lsarLookupPrivilegeNameRes = @file.ioctl_send_recv(lsarLookupPrivilegeNameReq).buffer
31
+ lsarLookupPrivilegeNameRes.raise_not_error_success("lookupPrivilegeName")
32
+ lsarLookupPrivilegeNameRes = LsarLookupPrivilegeNameRes.read(lsarLookupPrivilegeNameRes)
33
+ return lsarLookupPrivilegeNameRes.nameNdr.str.unpack("v*").pack("c*")
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,96 @@
1
+ module SmbRpc
2
+ class Lsarpc < Rpc
3
+
4
+ class LsarLookupSidsReq < BinData::Record
5
+ endian :little
6
+ request :request
7
+ string :policyHandle, :length => 20
8
+ lsapr_account_enum_buffer :sidEnumBuffer #declare in lsaEnumerateAccounts.rb
9
+ uint32 :entriesRead
10
+ uint32 :translatedNames
11
+ uint32 :lookupLevel, :value => 1
12
+ uint32 :mappedCount
13
+
14
+ def initialize_instance
15
+ super
16
+ policyHandle.value = get_parameter(:handle)
17
+
18
+ sid = get_parameter(:sid)
19
+ sidEnumBuffer.entriesRead.value = 1
20
+
21
+ sidArray = sid.split("-")
22
+ subAuthorityCount = sidArray.size - 3
23
+ sidEnumBuffer.ref_id_information[0].value = 1
24
+ sidEnumBuffer.information[0].sub_auth.value = subAuthorityCount
25
+ sidEnumBuffer.information[0].sid.revision.value = sidArray[1].to_i
26
+ sidEnumBuffer.information[0].sid.subAuthorityCount.value = subAuthorityCount
27
+ sidEnumBuffer.information[0].sid.identifierAuthority.value = [sidArray[2].to_i].pack("N").rjust(6, "\x00")
28
+ subAuthorityCount.times do |i|
29
+ sidEnumBuffer.information[0].sid.subAuthority[i] = sidArray[i + 3].to_i
30
+ end
31
+ request.pduHead.frag_length = self.num_bytes
32
+ request.opnum.value = 15 #LsarLookupSids
33
+ end
34
+ end
35
+
36
+ class Lsapr_trust_information < BinData::Record
37
+ endian :little
38
+ uint16 :len
39
+ uint16 :maxLength
40
+ uint32 :ref_id_name
41
+ uint32 :ref_id_sid
42
+ conformantandVaryingStrings :name
43
+ sid_element :sid #declared in lsarpc/lsaEnumerateAccounts.rb
44
+ end
45
+
46
+ class Lsapr_referenced_domain_list < BinData::Record
47
+ endian :little
48
+ uint32 :numberOfEntries
49
+ uint32 :ref_id_domains
50
+ uint32 :maxEntries
51
+ end
52
+
53
+ class Lsapr_translated_name < BinData::Record
54
+ endian :little
55
+ uint32 :use
56
+ rpc_unicode_string :name
57
+ uint32 :domainIndex
58
+ end
59
+
60
+ class Lsapr_translated_names < BinData::Record
61
+ endian :little
62
+ uint32 :numberOfNames
63
+ uint32 :ref_id_names
64
+ uint32 :numberOfEntries, :value => :numberOfNames
65
+ array :names, :type => :lsapr_translated_name, :initial_length => :numberOfEntries
66
+ array :nameNdr, :type => :conformantandVaryingStrings, :initial_length => :numberOfEntries
67
+ end
68
+
69
+ class LsarLookupSidsRes < BinData::Record
70
+ endian :little
71
+ response :response
72
+ uint32 :ref_id_referencedDomains
73
+ lsapr_referenced_domain_list :referencedDomains
74
+ uint32 :numberOfEntries
75
+ lsapr_trust_information :domain
76
+ lsapr_translated_names :translatedNames
77
+ uint32 :mappedCount
78
+ uint32 :windowsError
79
+ end
80
+
81
+ def lookupSids(sid:)
82
+ lsarLookupSidsReq = LsarLookupSidsReq.new(handle:@policyHandle, sid:sid)
83
+ lsarLookupSidsRes = @file.ioctl_send_recv(lsarLookupSidsReq).buffer
84
+ lsarLookupSidsRes.raise_not_error_success("lookupSids")
85
+ lsarLookupSidsRes = LsarLookupSidsRes.read(lsarLookupSidsRes)
86
+ result = lsarLookupSidsRes.windowsError
87
+ result == 0? result : (raise "LsaLookupSids Fail, WinError: %i"%[result])
88
+ h = {}
89
+ h[:domain] = lsarLookupSidsRes.domain.name.str.unpack("v*").pack("c*")
90
+ h[:name] = lsarLookupSidsRes.translatedNames.nameNdr[0].str.unpack("v*").pack("c*")
91
+ h[:type] = lsarLookupSidsRes.translatedNames.names[0].use
92
+ return h
93
+ end
94
+
95
+ end
96
+ end
@@ -0,0 +1,49 @@
1
+ module SmbRpc
2
+ class Lsarpc < Rpc
3
+
4
+ attr_accessor :accountHandle
5
+
6
+ class LsarOpenAccountReq < BinData::Record
7
+ endian :little
8
+ request :request
9
+ string :policyHandle, :length => 20
10
+ uint32 :sub_auth, :value => lambda { accountSid.subAuthorityCount.value }
11
+ rpc_sid :accountSid
12
+ uint32 :desiredAccess
13
+
14
+ def initialize_instance
15
+ super
16
+ policyHandle.value = get_parameter(:handle)
17
+ desiredAccess.value = get_parameter(:access)
18
+ sid = get_parameter(:sid)
19
+ sidArray = sid.split("-")
20
+ subAuthorityCount = sidArray.size - 3
21
+ accountSid.revision.value = sidArray[1].to_i
22
+ accountSid.subAuthorityCount.value = subAuthorityCount
23
+ accountSid.identifierAuthority.value = [sidArray[2].to_i].pack("N").rjust(6, "\x00")
24
+ subAuthorityCount.times do |i|
25
+ accountSid.subAuthority[i] = sidArray[i + 3].to_i
26
+ end
27
+ request.pduHead.frag_length = self.num_bytes
28
+ request.opnum.value = 17 #LsarOpenAccount
29
+ end
30
+ end
31
+
32
+ class LsarOpenAccountRes < BinData::Record
33
+ endian :little
34
+ response :response
35
+ string :accountHandle, :length => 20
36
+ uint32 :windowsError
37
+ end
38
+
39
+ def openAccount(desiredAccess:, sid:)
40
+ lsarOpenAccountReq = LsarOpenAccountReq.new(handle:@policyHandle, access:desiredAccess, sid:sid)
41
+ lsarOpenAccountRes = @file.ioctl_send_recv(lsarOpenAccountReq).buffer
42
+ lsarOpenAccountRes.raise_not_error_success("openAccount")
43
+ lsarOpenAccountRes = LsarOpenAccountRes.read(lsarOpenAccountRes)
44
+ @accountHandle = lsarOpenAccountRes.accountHandle
45
+ return self
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,52 @@
1
+
2
+ module SmbRpc
3
+ class Lsarpc < Rpc
4
+
5
+ attr_accessor :policyHandle
6
+
7
+ class Lsapr_object_attributes < BinData::Record
8
+ endian :little
9
+ uint32 :len
10
+ uint32 :rootDirectory
11
+ uint32 :objectName
12
+ uint32 :attributes
13
+ uint32 :securityDescriptor
14
+ uint32 :securityQualityOfService
15
+ def initialize_instance
16
+ super
17
+ len.value = self.num_bytes
18
+ end
19
+ end
20
+
21
+ class LsarOpenPolicy2Req < BinData::Record
22
+ endian :little
23
+ request :request
24
+ uint32 :systemName
25
+ lsapr_object_attributes :objectAttributes
26
+ uint32 :desiredAccess
27
+ def initialize_instance
28
+ super
29
+ desiredAccess.value = get_parameter(:accessMask)
30
+ request.pduHead.frag_length = self.num_bytes
31
+ request.opnum.value = 44 #LsarOpenPolicy2
32
+ end
33
+ end
34
+
35
+ class LsarOpenPolicy2Res < BinData::Record
36
+ endian :little
37
+ response :response
38
+ string :policyHandle, :length => 20
39
+ uint32 :windowsError
40
+ end
41
+
42
+ def openPolicy(desiredAccess:LSARPC_ALL_ACCESS_MASK["MAXIMUM_ALLOWED"])
43
+ lsarOpenPolicy2Req = LsarOpenPolicy2Req.new(accessMask:desiredAccess)
44
+ lsarOpenPolicy2Res = @file.ioctl_send_recv(lsarOpenPolicy2Req).buffer
45
+ lsarOpenPolicy2Res.raise_not_error_success("openPolicy")
46
+ lsarOpenPolicy2Res = LsarOpenPolicy2Res.read(lsarOpenPolicy2Res)
47
+ @policyHandle = lsarOpenPolicy2Res.policyHandle
48
+ return self
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,92 @@
1
+
2
+
3
+ module SmbRpc
4
+ class Lsarpc < Rpc
5
+
6
+ #[MS-DTYPE]
7
+ class Rpc_unicode_string < BinData::Record
8
+ endian :little
9
+ uint16 :len #length in bytes, multiple of 2, not include null terminate
10
+ uint16 :maximumLength #maxlength in bytes, multiple of 2, not less than length
11
+ #If MaximumLength is greater than zero, the buffer MUST contain a non-null value
12
+ uint32 :ref_id_buffer, :initial_value => 1 #set null pointer if maximumLength == 0
13
+ end
14
+
15
+ class Rpc_sid < BinData::Record
16
+ endian :little
17
+ uint8 :revision
18
+ uint8 :subAuthorityCount
19
+ string :identifierAuthority, :length => 6
20
+ array :subAuthority, :type => :uint32, :initial_length => :subAuthorityCount
21
+
22
+ def to_s
23
+ sid = "S-%i"%[self.revision]
24
+ sid << "-%i"%[self.identifierAuthority.unpack("H*")[0].to_i(16)]
25
+ self.subAuthority.each { |i| sid << "-%i"%[i] }
26
+ return sid
27
+ end
28
+ end
29
+
30
+ class Lsapr_policy_dns_domain_info < BinData::Record
31
+ endian :little
32
+ rpc_unicode_string :name
33
+ rpc_unicode_string :dnsDomainName
34
+ rpc_unicode_string :dnsForestName
35
+ string :guid, :length => 16
36
+ uint32 :sid
37
+ conformantandVaryingStrings :nameNdr, :onlyif => lambda { name.maximumLength > 0 }
38
+ conformantandVaryingStrings :dnsDomainNameNdr, :onlyif => lambda { dnsDomainName.maximumLength > 0 }
39
+ conformantandVaryingStrings :dnsForestNameNdr, :onlyif => lambda { dnsForestName.maximumLength > 0 }
40
+ end
41
+
42
+ class LsarQueryInformationPolicy2Req < BinData::Record
43
+ endian :little
44
+ request :request
45
+ string :policyHandle, :length => 20
46
+ uint16 :informationClass
47
+
48
+ def initialize_instance
49
+ super
50
+ policyHandle.value = get_parameter(:handle)
51
+ informationClass.value = get_parameter(:infoClass)
52
+ request.pduHead.frag_length = self.num_bytes
53
+ request.opnum.value = 46 #LsarQueryInformationPolicy2
54
+ end
55
+ end
56
+
57
+ class LsarQueryInformationPolicy2Res < BinData::Record
58
+ endian :little
59
+ response :response
60
+ uint32 :ref_id_policyInformation
61
+ uint32 :informationClass_tag
62
+
63
+ choice :policyInformation, :selection => lambda { get_parameter(:infoClass) } do
64
+ uint32 6 #enum _POLICY_LSA_SERVER_ROLE { PolicyServerRoleBackup = 2, PolicyServerRolePrimary}
65
+ lsapr_policy_dns_domain_info 12
66
+ end
67
+ uint32 :windowsError
68
+ end
69
+
70
+ def queryInformationPolicy(informationClass:LSARPC_POLICY_INFORMATION_CLASS["PolicyDnsDomainInformation"])
71
+ lsarQueryInformationPolicy2Req = LsarQueryInformationPolicy2Req.new(handle:@policyHandle, infoClass:informationClass)
72
+ response = @file.ioctl_send_recv(lsarQueryInformationPolicy2Req).buffer
73
+ response.raise_not_error_success("queryInformationPolicy")
74
+ lsarQueryInformationPolicy2Res = LsarQueryInformationPolicy2Res.new(infoClass:informationClass)
75
+ lsarQueryInformationPolicy2Res.read(response)
76
+ short = lsarQueryInformationPolicy2Res.policyInformation
77
+ out = {}
78
+ if informationClass == LSARPC_POLICY_INFORMATION_CLASS["PolicyDnsDomainInformation"]
79
+ out[:name] = short.nameNdr.str.unpack("v*").pack("c*") if short.name.len > 0
80
+ out[:dnsDomainName] = short.dnsDomainNameNdr.str.unpack("v*").pack("c*") if short.dnsDomainName.len > 0
81
+ out[:dnsForestName] = short.dnsForestNameNdr.str.unpack("v*").pack("c*") if short.dnsForestName.len > 0
82
+ out[:guid] = short.guid
83
+ out[:sid] = short.sid
84
+ end
85
+ if informationClass == LSARPC_POLICY_INFORMATION_CLASS["PolicyLsaServerRoleInformation"]
86
+ out[:policyServerRole] = short
87
+ end
88
+ return out
89
+ end
90
+
91
+ end
92
+ end