Coverage for /root/GitHubProjects/impacket/impacket/dcerpc/v5/wkst.py : 96%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# Impacket - Collection of Python classes for working with network protocols.
2#
3# SECUREAUTH LABS. Copyright (C) 2020 SecureAuth Corporation. All rights reserved.
4#
5# This software is provided under a slightly modified version
6# of the Apache Software License. See the accompanying LICENSE file
7# for more information.
8#
9# Description:
10# [MS-WKST] Interface implementation
11#
12# Best way to learn how to use these calls is to grab the protocol standard
13# so you understand what the call does, and then read the test case located
14# at https://github.com/SecureAuthCorp/impacket/tree/master/tests/SMB_RPC
15#
16# Some calls have helper functions, which makes it even easier to use.
17# They are located at the end of this file.
18# Helper functions start with "h"<name of the call>.
19# There are test cases for them too.
20#
21# Author:
22# Alberto Solino (@agsolino)
23#
24from impacket.dcerpc.v5.ndr import NDRCALL, NDRSTRUCT, NDRENUM, NDRUNION, NDRUniConformantArray, NDRUniFixedArray, \
25 NDRPOINTER
26from impacket.dcerpc.v5.dtypes import NULL, WSTR, ULONG, LPWSTR, LONG, LARGE_INTEGER, WIDESTR, RPC_UNICODE_STRING, \
27 LPULONG, LPLONG
28from impacket import system_errors
29from impacket.uuid import uuidtup_to_bin
30from impacket.dcerpc.v5.enum import Enum
31from impacket.dcerpc.v5.rpcrt import DCERPCException
33MSRPC_UUID_WKST = uuidtup_to_bin(('6BFFD098-A112-3610-9833-46C3F87E345A', '1.0'))
35class DCERPCSessionError(DCERPCException):
36 def __init__(self, error_string=None, error_code=None, packet=None):
37 DCERPCException.__init__(self, error_string, error_code, packet)
39 def __str__( self ):
40 key = self.error_code
41 if key in system_errors.ERROR_MESSAGES:
42 error_msg_short = system_errors.ERROR_MESSAGES[key][0]
43 error_msg_verbose = system_errors.ERROR_MESSAGES[key][1]
44 return 'WKST SessionError: code: 0x%x - %s - %s' % (self.error_code, error_msg_short, error_msg_verbose)
45 else:
46 return 'WKST SessionError: unknown error code: 0x%x' % self.error_code
48################################################################################
49# CONSTANTS
50################################################################################
52# 2.2.1.1 JOIN_MAX_PASSWORD_LENGTH
53JOIN_MAX_PASSWORD_LENGTH = 256
55# 2.2.1.2 JOIN_OBFUSCATOR_LENGTH
56JOIN_OBFUSCATOR_LENGTH = 8
58# 2.2.1.3 MAX_PREFERRED_LENGTH
59MAX_PREFERRED_LENGTH = 0xffffffff
61# 2.2.5.22 USE_INFO_1
62USE_OK = 0x00000000
63USE_PAUSED = 0x00000001
64USE_SESSLOST = 0x00000002
65USE_NETERR = 0x00000003
66USE_CONN = 0x00000004
67USE_RECONN = 0x00000005
69USE_WILDCARD = 0xFFFFFFFF
70USE_DISKDEV = 0x00000000
71USE_SPOOLDEV = 0x00000001
72USE_CHARDEV = 0x00000002
73USE_IPC = 0x00000003
75# 3.2.4.9 NetrUseDel (Opnum 10)
76# Force Level
77USE_NOFORCE = 0x00000000
78USE_FORCE = 0x00000001
79USE_LOTS_OF_FORCE = 0x00000002
81# 3.2.4.13 NetrJoinDomain2 (Opnum 22)
82# Options
83NETSETUP_JOIN_DOMAIN = 0x00000001
84NETSETUP_ACCT_CREATE = 0x00000002
85NETSETUP_ACCT_DELETE = 0x00000004
86NETSETUP_DOMAIN_JOIN_IF_JOINED = 0x00000020
87NETSETUP_JOIN_UNSECURE = 0x00000040
88NETSETUP_MACHINE_PWD_PASSED = 0x00000080
89NETSETUP_DEFER_SPN_SET = 0x00000100
90NETSETUP_JOIN_DC_ACCOUNT = 0x00000200
91NETSETUP_JOIN_WITH_NEW_NAME = 0x00000400
92NETSETUP_INSTALL_INVOCATION = 0x00040000
94# 3.2.4.14 NetrUnjoinDomain2 (Opnum 23)
95# Options
96NETSETUP_ACCT_DELETE = 0x00000004
97NETSETUP_IGNORE_UNSUPPORTED_FLAGS = 0x10000000
99# 3.2.4.15 NetrRenameMachineInDomain2 (Opnum 24)
100# Options
101NETSETUP_ACCT_CREATE = 0x00000002
102NETSETUP_DNS_NAME_CHANGES_ONLY = 0x00001000
104################################################################################
105# STRUCTURES
106################################################################################
108# 2.2.2.1 WKSSVC_IDENTIFY_HANDLE
109class WKSSVC_IDENTIFY_HANDLE(NDRSTRUCT):
110 structure = (
111 ('Data', WSTR),
112 )
114class LPWKSSVC_IDENTIFY_HANDLE(NDRPOINTER):
115 referent = (
116 ('Data', WKSSVC_IDENTIFY_HANDLE),
117 )
119# 2.2.2.2 WKSSVC_IMPERSONATE_HANDLE
120class WKSSVC_IMPERSONATE_HANDLE(NDRSTRUCT):
121 structure = (
122 ('Data',WSTR),
123 )
125class LPWKSSVC_IMPERSONATE_HANDLE(NDRPOINTER):
126 referent = (
127 ('Data', WKSSVC_IMPERSONATE_HANDLE),
128 )
130# 2.2.3.1 NETSETUP_JOIN_STATUS
131class NETSETUP_JOIN_STATUS(NDRENUM):
132 class enumItems(Enum):
133 NetSetupUnknownStatus = 0
134 NetSetupUnjoined = 1
135 NetSetupWorkgroupName = 2
136 NetSetupDomainName = 3
138# 2.2.3.2 NETSETUP_NAME_TYPE
139class NETSETUP_NAME_TYPE(NDRENUM):
140 class enumItems(Enum):
141 NetSetupUnknown = 0
142 NetSetupMachine = 1
143 NetSetupWorkgroup = 2
144 NetSetupDomain = 3
145 NetSetupNonExistentDomain = 4
146 NetSetupDnsMachine = 5
148# 2.2.3.3 NET_COMPUTER_NAME_TYPE
149class NET_COMPUTER_NAME_TYPE(NDRENUM):
150 class enumItems(Enum):
151 NetPrimaryComputerName = 0
152 NetAlternateComputerNames = 1
153 NetAllComputerNames = 2
154 NetComputerNameTypeMax = 3
156# 2.2.5.1 WKSTA_INFO_100
157class WKSTA_INFO_100(NDRSTRUCT):
158 structure = (
159 ('wki100_platform_id', ULONG),
160 ('wki100_computername', LPWSTR),
161 ('wki100_langroup', LPWSTR),
162 ('wki100_ver_major', ULONG),
163 ('wki100_ver_minor', ULONG),
164 )
166class LPWKSTA_INFO_100(NDRPOINTER):
167 referent = (
168 ('Data', WKSTA_INFO_100),
169 )
171# 2.2.5.2 WKSTA_INFO_101
172class WKSTA_INFO_101(NDRSTRUCT):
173 structure = (
174 ('wki101_platform_id', ULONG),
175 ('wki101_computername', LPWSTR),
176 ('wki101_langroup', LPWSTR),
177 ('wki101_ver_major', ULONG),
178 ('wki101_ver_minor', ULONG),
179 ('wki101_lanroot', LPWSTR),
180 )
182class LPWKSTA_INFO_101(NDRPOINTER):
183 referent = (
184 ('Data', WKSTA_INFO_101),
185 )
187# 2.2.5.3 WKSTA_INFO_102
188class WKSTA_INFO_102(NDRSTRUCT):
189 structure = (
190 ('wki102_platform_id', ULONG),
191 ('wki102_computername', LPWSTR),
192 ('wki102_langroup', LPWSTR),
193 ('wki102_ver_major', ULONG),
194 ('wki102_ver_minor', ULONG),
195 ('wki102_lanroot', LPWSTR),
196 ('wki102_logged_on_users', ULONG),
197 )
199class LPWKSTA_INFO_102(NDRPOINTER):
200 referent = (
201 ('Data', WKSTA_INFO_102),
202 )
204# 2.2.5.4 WKSTA_INFO_502
205class WKSTA_INFO_502(NDRSTRUCT):
206 structure = (
207 ('wki502_char_wait', ULONG),
208 ('wki502_collection_time', ULONG),
209 ('wki502_maximum_collection_count', ULONG),
210 ('wki502_keep_conn', ULONG),
211 ('wki502_max_cmds', ULONG),
212 ('wki502_sess_timeout', ULONG),
213 ('wki502_siz_char_buf', ULONG),
214 ('wki502_max_threads', ULONG),
215 ('wki502_lock_quota', ULONG),
216 ('wki502_lock_increment', ULONG),
217 ('wki502_lock_maximum', ULONG),
218 ('wki502_pipe_increment', ULONG),
219 ('wki502_pipe_maximum', ULONG),
220 ('wki502_cache_file_timeout', ULONG),
221 ('wki502_dormant_file_limit', ULONG),
222 ('wki502_read_ahead_throughput', ULONG),
223 ('wki502_num_mailslot_buffers', ULONG),
224 ('wki502_num_srv_announce_buffers', ULONG),
225 ('wki502_max_illegal_datagram_events', ULONG),
226 ('wki502_illegal_datagram_event_reset_frequency', ULONG),
227 ('wki502_log_election_packets', LONG),
228 ('wki502_use_opportunistic_locking', LONG),
229 ('wki502_use_unlock_behind', LONG),
230 ('wki502_use_close_behind', LONG),
231 ('wki502_buf_named_pipes', LONG),
232 ('wki502_use_lock_read_unlock', LONG),
233 ('wki502_utilize_nt_caching', LONG),
234 ('wki502_use_raw_read', LONG),
235 ('wki502_use_raw_write', LONG),
236 ('wki502_use_write_raw_data', LONG),
237 ('wki502_use_encryption', LONG),
238 ('wki502_buf_files_deny_write', LONG),
239 ('wki502_buf_read_only_files', LONG),
240 ('wki502_force_core_create_mode', LONG),
241 ('wki502_use_512_byte_max_transfer', LONG),
242 )
244class LPWKSTA_INFO_502(NDRPOINTER):
245 referent = (
246 ('Data', WKSTA_INFO_502),
247 )
249# 2.2.5.5 WKSTA_INFO_1013
250class WKSTA_INFO_1013(NDRSTRUCT):
251 structure = (
252 ('wki1013_keep_conn', ULONG),
253 )
255class LPWKSTA_INFO_1013(NDRPOINTER):
256 referent = (
257 ('Data', WKSTA_INFO_1013),
258 )
260# 2.2.5.6 WKSTA_INFO_1018
261class WKSTA_INFO_1018(NDRSTRUCT):
262 structure = (
263 ('wki1018_sess_timeout', ULONG),
264 )
266class LPWKSTA_INFO_1018(NDRPOINTER):
267 referent = (
268 ('Data', WKSTA_INFO_1018),
269 )
271# 2.2.5.7 WKSTA_INFO_1046
272class WKSTA_INFO_1046(NDRSTRUCT):
273 structure = (
274 ('wki1046_dormant_file_limit', ULONG),
275 )
277class LPWKSTA_INFO_1046(NDRPOINTER):
278 referent = (
279 ('Data', WKSTA_INFO_1046),
280 )
282# 2.2.4.1 WKSTA_INFO
283class WKSTA_INFO(NDRUNION):
284 commonHdr = (
285 ('tag', ULONG),
286 )
287 union = {
288 100: ('WkstaInfo100', LPWKSTA_INFO_100),
289 101: ('WkstaInfo101', LPWKSTA_INFO_101),
290 102: ('WkstaInfo102', LPWKSTA_INFO_102),
291 502: ('WkstaInfo502', LPWKSTA_INFO_502),
292 1013: ('WkstaInfo1013', LPWKSTA_INFO_1013),
293 1018: ('WkstaInfo1018', LPWKSTA_INFO_1018),
294 1046: ('WkstaInfo1046', LPWKSTA_INFO_1046),
295 }
297class LPWKSTA_INFO(NDRPOINTER):
298 referent = (
299 ('Data', WKSTA_INFO),
300 )
302# 2.2.5.8 WKSTA_TRANSPORT_INFO_0
303class WKSTA_TRANSPORT_INFO_0(NDRSTRUCT):
304 structure = (
305 ('wkti0_quality_of_service', ULONG),
306 ('wkti0_number_of_vcs', ULONG),
307 ('wkti0_transport_name', LPWSTR),
308 ('wkti0_transport_address', LPWSTR),
309 ('wkti0_wan_ish', ULONG),
310 )
312# 2.2.5.9 WKSTA_USER_INFO_0
313class WKSTA_USER_INFO_0(NDRSTRUCT):
314 structure = (
315 ('wkui0_username', LPWSTR),
316 )
318# 2.2.5.10 WKSTA_USER_INFO_1
319class WKSTA_USER_INFO_1(NDRSTRUCT):
320 structure = (
321 ('wkui1_username', LPWSTR),
322 ('wkui1_logon_domain', LPWSTR),
323 ('wkui1_oth_domains', LPWSTR),
324 ('wkui1_logon_server', LPWSTR),
325 )
327# 2.2.5.11 STAT_WORKSTATION_0
328class STAT_WORKSTATION_0(NDRSTRUCT):
329 structure = (
330 ('StatisticsStartTime', LARGE_INTEGER),
331 ('BytesReceived', LARGE_INTEGER),
332 ('SmbsReceived', LARGE_INTEGER),
333 ('PagingReadBytesRequested', LARGE_INTEGER),
334 ('NonPagingReadBytesRequested', LARGE_INTEGER),
335 ('CacheReadBytesRequested', LARGE_INTEGER),
336 ('NetworkReadBytesRequested', LARGE_INTEGER),
337 ('BytesTransmitted', LARGE_INTEGER),
338 ('SmbsTransmitted', LARGE_INTEGER),
339 ('PagingWriteBytesRequested', LARGE_INTEGER),
340 ('NonPagingWriteBytesRequested', LARGE_INTEGER),
341 ('CacheWriteBytesRequested', LARGE_INTEGER),
342 ('NetworkWriteBytesRequested', LARGE_INTEGER),
343 ('InitiallyFailedOperations', ULONG),
344 ('FailedCompletionOperations', ULONG),
345 ('ReadOperations', ULONG),
346 ('RandomReadOperations', ULONG),
347 ('ReadSmbs', ULONG),
348 ('LargeReadSmbs', ULONG),
349 ('SmallReadSmbs', ULONG),
350 ('WriteOperations', ULONG),
351 ('RandomWriteOperations', ULONG),
352 ('WriteSmbs', ULONG),
353 ('LargeWriteSmbs', ULONG),
354 ('SmallWriteSmbs', ULONG),
355 ('RawReadsDenied', ULONG),
356 ('RawWritesDenied', ULONG),
357 ('NetworkErrors', ULONG),
358 ('Sessions', ULONG),
359 ('FailedSessions', ULONG),
360 ('Reconnects', ULONG),
361 ('CoreConnects', ULONG),
362 ('Lanman20Connects', ULONG),
363 ('Lanman21Connects', ULONG),
364 ('LanmanNtConnects', ULONG),
365 ('ServerDisconnects', ULONG),
366 ('HungSessions', ULONG),
367 ('UseCount', ULONG),
368 ('FailedUseCount', ULONG),
369 ('CurrentCommands', ULONG),
370 )
372class LPSTAT_WORKSTATION_0(NDRPOINTER):
373 referent = (
374 ('Data', STAT_WORKSTATION_0),
375 )
377# 2.2.5.12 WKSTA_USER_INFO_0_CONTAINER
378class WKSTA_USER_INFO_0_ARRAY(NDRUniConformantArray):
379 item = WKSTA_USER_INFO_0
381class LPWKSTA_USER_INFO_0_ARRAY(NDRPOINTER):
382 referent = (
383 ('Data', WKSTA_USER_INFO_0_ARRAY),
384 )
386class WKSTA_USER_INFO_0_CONTAINER(NDRSTRUCT):
387 structure = (
388 ('EntriesRead', ULONG),
389 ('Buffer', LPWKSTA_USER_INFO_0_ARRAY),
390 )
392class LPWKSTA_USER_INFO_0_CONTAINER(NDRPOINTER):
393 referent = (
394 ('Data', WKSTA_USER_INFO_0_CONTAINER),
395 )
397# 2.2.5.13 WKSTA_USER_INFO_1_CONTAINER
398class WKSTA_USER_INFO_1_ARRAY(NDRUniConformantArray):
399 item = WKSTA_USER_INFO_1
401class LPWKSTA_USER_INFO_1_ARRAY(NDRPOINTER):
402 referent = (
403 ('Data', WKSTA_USER_INFO_1_ARRAY),
404 )
406class WKSTA_USER_INFO_1_CONTAINER(NDRSTRUCT):
407 structure = (
408 ('EntriesRead', ULONG),
409 ('Buffer', LPWKSTA_USER_INFO_1_ARRAY),
410 )
412class LPWKSTA_USER_INFO_1_CONTAINER(NDRPOINTER):
413 referent = (
414 ('Data', WKSTA_USER_INFO_1_CONTAINER),
415 )
417# 2.2.5.14 WKSTA_USER_ENUM_STRUCT
418class WKSTA_USER_ENUM_UNION(NDRUNION):
419 commonHdr = (
420 ('tag', ULONG),
421 )
423 union = {
424 0: ('Level0', LPWKSTA_USER_INFO_0_CONTAINER),
425 1: ('Level1', LPWKSTA_USER_INFO_1_CONTAINER),
426 }
428class WKSTA_USER_ENUM_STRUCT(NDRSTRUCT):
429 structure = (
430 ('Level', ULONG),
431 ('WkstaUserInfo', WKSTA_USER_ENUM_UNION),
432 )
435# 2.2.5.15 WKSTA_TRANSPORT_INFO_0_CONTAINER
436class WKSTA_TRANSPORT_INFO_0_ARRAY(NDRUniConformantArray):
437 item = WKSTA_TRANSPORT_INFO_0
439class LPWKSTA_TRANSPORT_INFO_0_ARRAY(NDRPOINTER):
440 referent = (
441 ('Data', WKSTA_TRANSPORT_INFO_0_ARRAY),
442 )
444class WKSTA_TRANSPORT_INFO_0_CONTAINER(NDRSTRUCT):
445 structure = (
446 ('EntriesRead', ULONG),
447 ('Buffer', LPWKSTA_TRANSPORT_INFO_0_ARRAY),
448 )
450class LPWKSTA_TRANSPORT_INFO_0_CONTAINER(NDRPOINTER):
451 referent = (
452 ('Data', WKSTA_TRANSPORT_INFO_0_CONTAINER),
453 )
455# 2.2.5.16 WKSTA_TRANSPORT_ENUM_STRUCT
456class WKSTA_TRANSPORT_ENUM_UNION(NDRUNION):
457 commonHdr = (
458 ('tag', ULONG),
459 )
461 union = {
462 0: ('Level0', LPWKSTA_TRANSPORT_INFO_0_CONTAINER),
463 }
465class WKSTA_TRANSPORT_ENUM_STRUCT(NDRSTRUCT):
466 structure = (
467 ('Level', ULONG),
468 ('WkstaTransportInfo', WKSTA_TRANSPORT_ENUM_UNION),
469 )
471# 2.2.5.17 JOINPR_USER_PASSWORD
472class WCHAR_ARRAY(WIDESTR):
473 def getDataLen(self, data, offset=0):
474 return JOIN_MAX_PASSWORD_LENGTH
476class CHAR_ARRAY(NDRUniFixedArray):
477 def getDataLen(self, data, offset=0):
478 return JOIN_OBFUSCATOR_LENGTH
480class JOINPR_USER_PASSWORD(NDRSTRUCT):
481 structure = (
482 ('Obfuscator', CHAR_ARRAY),
483 ('Buffer', WCHAR_ARRAY),
484 )
486# 2.2.5.18 JOINPR_ENCRYPTED_USER_PASSWORD
487class JOINPR_ENCRYPTED_USER_PASSWORD(NDRSTRUCT):
488 structure = (
489 ('Buffer', '524s=b""'),
490 )
491 def getAlignment(self):
492 return 1
494class PJOINPR_ENCRYPTED_USER_PASSWORD(NDRPOINTER):
495 referent = (
496 ('Data', JOINPR_ENCRYPTED_USER_PASSWORD),
497 )
499# 2.2.5.19 UNICODE_STRING
500UNICODE_STRING = WSTR
501class PUNICODE_STRING(NDRPOINTER):
502 referent = (
503 ('Data', UNICODE_STRING),
504 )
506# 2.2.5.20 NET_COMPUTER_NAME_ARRAY
507class UNICODE_STRING_ARRAY(NDRUniConformantArray):
508 item = RPC_UNICODE_STRING
510class PUNICODE_STRING_ARRAY(NDRPOINTER):
511 referent = (
512 ('Data', UNICODE_STRING_ARRAY),
513 )
515class NET_COMPUTER_NAME_ARRAY(NDRSTRUCT):
516 structure = (
517 ('EntriesRead', ULONG),
518 ('ComputerNames', PUNICODE_STRING_ARRAY),
519 )
521class PNET_COMPUTER_NAME_ARRAY(NDRPOINTER):
522 referent = (
523 ('Data', NET_COMPUTER_NAME_ARRAY),
524 )
526# 2.2.5.21 USE_INFO_0
527class USE_INFO_0(NDRSTRUCT):
528 structure = (
529 ('ui0_local', LPWSTR),
530 ('ui0_remote', LPWSTR),
531 )
533class LPUSE_INFO_0(NDRPOINTER):
534 referent = (
535 ('Data', USE_INFO_0),
536 )
538# 2.2.5.22 USE_INFO_1
539class USE_INFO_1(NDRSTRUCT):
540 structure = (
541 ('ui1_local', LPWSTR),
542 ('ui1_remote', LPWSTR),
543 ('ui1_password', LPWSTR),
544 ('ui1_status', ULONG),
545 ('ui1_asg_type', ULONG),
546 ('ui1_refcount', ULONG),
547 ('ui1_usecount', ULONG),
548 )
550class LPUSE_INFO_1(NDRPOINTER):
551 referent = (
552 ('Data', USE_INFO_1),
553 )
555# 2.2.5.23 USE_INFO_2
556class USE_INFO_2(NDRSTRUCT):
557 structure = (
558 ('ui2_useinfo', USE_INFO_1),
559 ('ui2_username', LPWSTR),
560 ('ui2_domainname', LPWSTR),
561 )
563class LPUSE_INFO_2(NDRPOINTER):
564 referent = (
565 ('Data', USE_INFO_2),
566 )
568# 2.2.5.24 USE_INFO_3
569class USE_INFO_3(NDRSTRUCT):
570 structure = (
571 ('ui3_ui2', USE_INFO_2),
572 ('ui3_flags', ULONG),
573 )
575class LPUSE_INFO_3(NDRPOINTER):
576 referent = (
577 ('Data', USE_INFO_3),
578 )
580# 2.2.4.2 USE_INFO
581class USE_INFO(NDRUNION):
582 commonHdr = (
583 ('tag', ULONG),
584 )
586 union = {
587 0: ('UseInfo0', LPUSE_INFO_0),
588 1: ('UseInfo1', LPUSE_INFO_1),
589 2: ('UseInfo2', LPUSE_INFO_2),
590 3: ('UseInfo3', LPUSE_INFO_3),
591 }
593# 2.2.5.25 USE_INFO_0_CONTAINER
594class USE_INFO_0_CONTAINER(NDRSTRUCT):
595 structure = (
596 ('EntriesRead', ULONG),
597 ('Buffer', LPUSE_INFO_0),
598 )
600class LPUSE_INFO_0_CONTAINER(NDRPOINTER):
601 referent = (
602 ('Data', USE_INFO_0_CONTAINER),
603 )
605# 2.2.5.26 USE_INFO_1_CONTAINER
606class USE_INFO_1_CONTAINER(NDRSTRUCT):
607 structure = (
608 ('EntriesRead', ULONG),
609 ('Buffer', LPUSE_INFO_1),
610 )
612class LPUSE_INFO_1_CONTAINER(NDRPOINTER):
613 referent = (
614 ('Data', USE_INFO_1_CONTAINER),
615 )
617# 2.2.5.27 USE_INFO_2_CONTAINER
618class USE_INFO_2_CONTAINER(NDRSTRUCT):
619 structure = (
620 ('EntriesRead', ULONG),
621 ('Buffer', LPUSE_INFO_2),
622 )
624class LPUSE_INFO_2_CONTAINER(NDRPOINTER):
625 referent = (
626 ('Data', USE_INFO_2_CONTAINER),
627 )
629# 2.2.5.28 USE_ENUM_STRUCT
630class USE_ENUM_UNION(NDRUNION):
631 commonHdr = (
632 ('tag', ULONG),
633 )
635 union = {
636 0: ('Level0', LPUSE_INFO_0_CONTAINER),
637 1: ('Level1', LPUSE_INFO_1_CONTAINER),
638 2: ('Level2', LPUSE_INFO_2_CONTAINER),
639 }
641class USE_ENUM_STRUCT(NDRSTRUCT):
642 structure = (
643 ('Level', ULONG),
644 ('UseInfo', USE_ENUM_UNION),
645 )
647################################################################################
648# RPC CALLS
649################################################################################
651# 3.2.4.1 NetrWkstaGetInfo (Opnum 0)
652class NetrWkstaGetInfo(NDRCALL):
653 opnum = 0
654 structure = (
655 ('ServerName', LPWKSSVC_IDENTIFY_HANDLE),
656 ('Level', ULONG),
657 )
659class NetrWkstaGetInfoResponse(NDRCALL):
660 structure = (
661 ('WkstaInfo',WKSTA_INFO),
662 ('ErrorCode',ULONG),
663 )
665# 3.2.4.2 NetrWkstaSetInfo (Opnum 1)
666class NetrWkstaSetInfo(NDRCALL):
667 opnum = 1
668 structure = (
669 ('ServerName', LPWKSSVC_IDENTIFY_HANDLE),
670 ('Level', ULONG),
671 ('WkstaInfo',WKSTA_INFO),
672 ('ErrorParameter',LPULONG),
673 )
675class NetrWkstaSetInfoResponse(NDRCALL):
676 structure = (
677 ('ErrorParameter',LPULONG),
678 ('ErrorCode',ULONG),
679 )
681# 3.2.4.3 NetrWkstaUserEnum (Opnum 2)
682class NetrWkstaUserEnum(NDRCALL):
683 opnum = 2
684 structure = (
685 ('ServerName', LPWKSSVC_IDENTIFY_HANDLE),
686 ('UserInfo', WKSTA_USER_ENUM_STRUCT),
687 ('PreferredMaximumLength', ULONG),
688 ('ResumeHandle', LPULONG),
689 )
691class NetrWkstaUserEnumResponse(NDRCALL):
692 structure = (
693 ('UserInfo',WKSTA_USER_ENUM_STRUCT),
694 ('TotalEntries',ULONG),
695 ('ResumeHandle',ULONG),
696 ('ErrorCode',ULONG),
697 )
699# 3.2.4.4 NetrWkstaTransportEnum (Opnum 5)
700class NetrWkstaTransportEnum(NDRCALL):
701 opnum = 5
702 structure = (
703 ('ServerName', LPWKSSVC_IDENTIFY_HANDLE),
704 ('TransportInfo', WKSTA_TRANSPORT_ENUM_STRUCT),
705 ('PreferredMaximumLength', ULONG),
706 ('ResumeHandle', LPULONG),
707 )
709class NetrWkstaTransportEnumResponse(NDRCALL):
710 structure = (
711 ('TransportInfo',WKSTA_TRANSPORT_ENUM_STRUCT),
712 ('TotalEntries',ULONG),
713 ('ResumeHandle',ULONG),
714 ('ErrorCode',ULONG),
715 )
717# 3.2.4.5 NetrWkstaTransportAdd (Opnum 6)
718class NetrWkstaTransportAdd(NDRCALL):
719 opnum = 6
720 structure = (
721 ('ServerName', LPWKSSVC_IDENTIFY_HANDLE),
722 ('Level', ULONG),
723 ('TransportInfo',WKSTA_TRANSPORT_INFO_0),
724 ('ErrorParameter',LPULONG),
725 )
727class NetrWkstaTransportAddResponse(NDRCALL):
728 structure = (
729 ('ErrorParameter',LPULONG),
730 ('ErrorCode',ULONG),
731 )
733# 3.2.4.7 NetrUseAdd (Opnum 8)
734class NetrUseAdd(NDRCALL):
735 opnum = 8
736 structure = (
737 ('ServerName', LPWKSSVC_IMPERSONATE_HANDLE),
738 ('Level', ULONG),
739 ('InfoStruct',USE_INFO),
740 ('ErrorParameter',LPULONG),
741 )
743class NetrUseAddResponse(NDRCALL):
744 structure = (
745 ('ErrorParameter',LPULONG),
746 ('ErrorCode',ULONG),
747 )
749# 3.2.4.8 NetrUseGetInfo (Opnum 9)
750class NetrUseGetInfo(NDRCALL):
751 opnum = 9
752 structure = (
753 ('ServerName', LPWKSSVC_IMPERSONATE_HANDLE),
754 ('UseName', WSTR),
755 ('Level',ULONG),
756 )
758class NetrUseGetInfoResponse(NDRCALL):
759 structure = (
760 ('InfoStruct',USE_INFO),
761 ('ErrorCode',ULONG),
762 )
764# 3.2.4.9 NetrUseDel (Opnum 10)
765class NetrUseDel(NDRCALL):
766 opnum = 10
767 structure = (
768 ('ServerName', LPWKSSVC_IMPERSONATE_HANDLE),
769 ('UseName', WSTR),
770 ('ForceLevel',ULONG),
771 )
773class NetrUseDelResponse(NDRCALL):
774 structure = (
775 ('ErrorCode',ULONG),
776 )
778# 3.2.4.10 NetrUseEnum (Opnum 11)
779class NetrUseEnum(NDRCALL):
780 opnum = 11
781 structure = (
782 ('ServerName', LPWKSSVC_IMPERSONATE_HANDLE),
783 ('InfoStruct', USE_ENUM_STRUCT),
784 ('PreferredMaximumLength',ULONG),
785 ('ResumeHandle',LPULONG),
786 )
788class NetrUseEnumResponse(NDRCALL):
789 structure = (
790 ('InfoStruct',USE_ENUM_STRUCT),
791 ('TotalEntries',ULONG),
792 ('ResumeHandle',LPULONG),
793 ('ErrorCode',ULONG),
794 )
796# 3.2.4.11 NetrWorkstationStatisticsGet (Opnum 13)
797class NetrWorkstationStatisticsGet(NDRCALL):
798 opnum = 13
799 structure = (
800 ('ServerName', LPWKSSVC_IDENTIFY_HANDLE),
801 ('ServiceName', LPWSTR),
802 ('Level',ULONG),
803 ('Options',ULONG),
804 )
806class NetrWorkstationStatisticsGetResponse(NDRCALL):
807 structure = (
808 ('Buffer',LPSTAT_WORKSTATION_0),
809 ('ErrorCode',ULONG),
810 )
812# 3.2.4.12 NetrGetJoinInformation (Opnum 20)
813class NetrGetJoinInformation(NDRCALL):
814 opnum = 20
815 structure = (
816 ('ServerName', LPWKSSVC_IMPERSONATE_HANDLE),
817 ('NameBuffer', LPWSTR),
818 )
820class NetrGetJoinInformationResponse(NDRCALL):
821 structure = (
822 ('NameBuffer',LPWSTR),
823 ('BufferType',NETSETUP_JOIN_STATUS),
824 ('ErrorCode',ULONG),
825 )
827# 3.2.4.13 NetrJoinDomain2 (Opnum 22)
828class NetrJoinDomain2(NDRCALL):
829 opnum = 22
830 structure = (
831 ('ServerName', LPWSTR),
832 ('DomainNameParam', WSTR),
833 ('MachineAccountOU', LPWSTR),
834 ('AccountName', LPWSTR),
835 ('Password', PJOINPR_ENCRYPTED_USER_PASSWORD),
836 ('Options', ULONG),
837 )
839class NetrJoinDomain2Response(NDRCALL):
840 structure = (
841 ('ErrorCode',ULONG),
842 )
844# 3.2.4.14 NetrUnjoinDomain2 (Opnum 23)
845class NetrUnjoinDomain2(NDRCALL):
846 opnum = 23
847 structure = (
848 ('ServerName', LPWSTR),
849 ('AccountName', LPWSTR),
850 ('Password', PJOINPR_ENCRYPTED_USER_PASSWORD),
851 ('Options', ULONG),
852 )
854class NetrUnjoinDomain2Response(NDRCALL):
855 structure = (
856 ('ErrorCode',ULONG),
857 )
859# 3.2.4.15 NetrRenameMachineInDomain2 (Opnum 24)
860class NetrRenameMachineInDomain2(NDRCALL):
861 opnum = 24
862 structure = (
863 ('ServerName', LPWSTR),
864 ('MachineName', LPWSTR),
865 ('AccountName', LPWSTR),
866 ('Password', PJOINPR_ENCRYPTED_USER_PASSWORD),
867 ('Options', ULONG),
868 )
870class NetrRenameMachineInDomain2Response(NDRCALL):
871 structure = (
872 ('ErrorCode',ULONG),
873 )
875# 3.2.4.16 NetrValidateName2 (Opnum 25)
876class NetrValidateName2(NDRCALL):
877 opnum = 25
878 structure = (
879 ('ServerName', LPWSTR),
880 ('NameToValidate', WSTR),
881 ('AccountName', LPWSTR),
882 ('Password', PJOINPR_ENCRYPTED_USER_PASSWORD),
883 ('NameType', NETSETUP_NAME_TYPE),
884 )
886class NetrValidateName2Response(NDRCALL):
887 structure = (
888 ('ErrorCode',ULONG),
889 )
891# 3.2.4.17 NetrGetJoinableOUs2 (Opnum 26)
892class NetrGetJoinableOUs2(NDRCALL):
893 opnum = 26
894 structure = (
895 ('ServerName', LPWSTR),
896 ('DomainNameParam', WSTR),
897 ('AccountName', LPWSTR),
898 ('Password', PJOINPR_ENCRYPTED_USER_PASSWORD),
899 ('OUCount', ULONG),
900 )
902class NetrGetJoinableOUs2Response(NDRCALL):
903 structure = (
904 ('OUCount', LPLONG),
905 ('OUs',PUNICODE_STRING_ARRAY),
906 ('ErrorCode',ULONG),
907 )
909# 3.2.4.18 NetrAddAlternateComputerName (Opnum 27)
910class NetrAddAlternateComputerName(NDRCALL):
911 opnum = 27
912 structure = (
913 ('ServerName', LPWSTR),
914 ('AlternateName', LPWSTR),
915 ('DomainAccount', LPWSTR),
916 ('EncryptedPassword', PJOINPR_ENCRYPTED_USER_PASSWORD),
917 ('Reserved', ULONG),
918 )
920class NetrAddAlternateComputerNameResponse(NDRCALL):
921 structure = (
922 ('ErrorCode',ULONG),
923 )
925# 3.2.4.19 NetrRemoveAlternateComputerName (Opnum 28)
926class NetrRemoveAlternateComputerName(NDRCALL):
927 opnum = 28
928 structure = (
929 ('ServerName', LPWSTR),
930 ('AlternateName', LPWSTR),
931 ('DomainAccount', LPWSTR),
932 ('EncryptedPassword', PJOINPR_ENCRYPTED_USER_PASSWORD),
933 ('Reserved', ULONG),
934 )
936class NetrRemoveAlternateComputerNameResponse(NDRCALL):
937 structure = (
938 ('ErrorCode',ULONG),
939 )
941# 3.2.4.20 NetrSetPrimaryComputerName (Opnum 29)
942class NetrSetPrimaryComputerName(NDRCALL):
943 opnum = 29
944 structure = (
945 ('ServerName', LPWSTR),
946 ('PrimaryName', LPWSTR),
947 ('DomainAccount', LPWSTR),
948 ('EncryptedPassword', PJOINPR_ENCRYPTED_USER_PASSWORD),
949 ('Reserved', ULONG),
950 )
952class NetrSetPrimaryComputerNameResponse(NDRCALL):
953 structure = (
954 ('ErrorCode',ULONG),
955 )
957# 3.2.4.21 NetrEnumerateComputerNames (Opnum 30)
958class NetrEnumerateComputerNames(NDRCALL):
959 opnum = 30
960 structure = (
961 ('ServerName', LPWKSSVC_IMPERSONATE_HANDLE),
962 ('NameType', NET_COMPUTER_NAME_TYPE),
963 ('Reserved', ULONG),
964 )
966class NetrEnumerateComputerNamesResponse(NDRCALL):
967 structure = (
968 ('ComputerNames',PNET_COMPUTER_NAME_ARRAY),
969 ('ErrorCode',ULONG),
970 )
972################################################################################
973# OPNUMs and their corresponding structures
974################################################################################
975OPNUMS = {
976 0 : (NetrWkstaGetInfo, NetrWkstaGetInfoResponse),
977 1 : (NetrWkstaSetInfo, NetrWkstaSetInfoResponse),
978 2 : (NetrWkstaUserEnum, NetrWkstaUserEnumResponse),
979 5 : (NetrWkstaTransportEnum, NetrWkstaTransportEnumResponse),
980 6 : (NetrWkstaTransportAdd, NetrWkstaTransportAddResponse),
981# 7 : (NetrWkstaTransportDel, NetrWkstaTransportDelResponse),
982 8 : (NetrUseAdd, NetrUseAddResponse),
983 9 : (NetrUseGetInfo, NetrUseGetInfoResponse),
98410 : (NetrUseDel, NetrUseDelResponse),
98511 : (NetrUseEnum, NetrUseEnumResponse),
98613 : (NetrWorkstationStatisticsGet, NetrWorkstationStatisticsGetResponse),
98720 : (NetrGetJoinInformation, NetrGetJoinInformationResponse),
98822 : (NetrJoinDomain2, NetrJoinDomain2Response),
98923 : (NetrUnjoinDomain2, NetrUnjoinDomain2Response),
99024 : (NetrRenameMachineInDomain2, NetrRenameMachineInDomain2Response),
99125 : (NetrValidateName2, NetrValidateName2Response),
99226 : (NetrGetJoinableOUs2, NetrGetJoinableOUs2Response),
99327 : (NetrAddAlternateComputerName, NetrAddAlternateComputerNameResponse),
99428 : (NetrRemoveAlternateComputerName, NetrRemoveAlternateComputerNameResponse),
99529 : (NetrSetPrimaryComputerName, NetrSetPrimaryComputerNameResponse),
99630 : (NetrEnumerateComputerNames, NetrEnumerateComputerNamesResponse),
997}
999################################################################################
1000# HELPER FUNCTIONS
1001################################################################################
1002def checkNullString(string):
1003 if string == NULL:
1004 return string
1006 if string[-1:] != '\x00':
1007 return string + '\x00'
1008 else:
1009 return string
1011def hNetrWkstaGetInfo(dce, level):
1012 request = NetrWkstaGetInfo()
1013 request['ServerName'] = '\x00'*10
1014 request['Level'] = level
1015 return dce.request(request)
1017def hNetrWkstaUserEnum(dce, level, preferredMaximumLength=0xffffffff):
1018 request = NetrWkstaUserEnum()
1019 request['ServerName'] = '\x00'*10
1020 request['UserInfo']['Level'] = level
1021 request['UserInfo']['WkstaUserInfo']['tag'] = level
1022 request['PreferredMaximumLength'] = preferredMaximumLength
1023 return dce.request(request)
1025def hNetrWkstaTransportEnum(dce, level, resumeHandle = 0, preferredMaximumLength = 0xffffffff):
1026 request = NetrWkstaTransportEnum()
1027 request['ServerName'] = '\x00'*10
1028 request['TransportInfo']['Level'] = level
1029 request['TransportInfo']['WkstaTransportInfo']['tag'] = level
1030 request['ResumeHandle'] = resumeHandle
1031 request['PreferredMaximumLength'] = preferredMaximumLength
1032 return dce.request(request)
1034def hNetrWkstaSetInfo(dce, level, wkstInfo):
1035 request = NetrWkstaSetInfo()
1036 request['ServerName'] = '\x00'*10
1037 request['Level'] = level
1038 request['WkstaInfo']['tag'] = level
1039 request['WkstaInfo']['WkstaInfo%d'% level] = wkstInfo
1040 return dce.request(request)
1042def hNetrWorkstationStatisticsGet(dce, serviceName, level, options):
1043 request = NetrWorkstationStatisticsGet()
1044 request['ServerName'] = '\x00'*10
1045 request['ServiceName'] = serviceName
1046 request['Level'] = level
1047 request['Options'] = options
1048 return dce.request(request)
1050def hNetrGetJoinInformation(dce, nameBuffer):
1051 request = NetrGetJoinInformation()
1052 request['ServerName'] = '\x00'*10
1053 request['NameBuffer'] = nameBuffer
1054 return dce.request(request)
1056def hNetrJoinDomain2(dce, domainNameParam, machineAccountOU, accountName, password, options):
1057 request = NetrJoinDomain2()
1058 request['ServerName'] = '\x00'*10
1059 request['DomainNameParam'] = checkNullString(domainNameParam)
1060 request['MachineAccountOU'] = checkNullString(machineAccountOU)
1061 request['AccountName'] = checkNullString(accountName)
1062 if password == NULL: 1062 ↛ 1063line 1062 didn't jump to line 1063, because the condition on line 1062 was never true
1063 request['Password'] = NULL
1064 else:
1065 request['Password']['Buffer'] = password
1066 request['Options'] = options
1067 return dce.request(request)
1069def hNetrUnjoinDomain2(dce, accountName, password, options):
1070 request = NetrUnjoinDomain2()
1071 request['ServerName'] = '\x00'*10
1072 request['AccountName'] = checkNullString(accountName)
1073 if password == NULL: 1073 ↛ 1074line 1073 didn't jump to line 1074, because the condition on line 1073 was never true
1074 request['Password'] = NULL
1075 else:
1076 request['Password']['Buffer'] = password
1077 request['Options'] = options
1078 return dce.request(request)
1080def hNetrRenameMachineInDomain2(dce, machineName, accountName, password, options):
1081 request = NetrRenameMachineInDomain2()
1082 request['ServerName'] = '\x00'*10
1083 request['MachineName'] = checkNullString(machineName)
1084 request['AccountName'] = checkNullString(accountName)
1085 if password == NULL: 1085 ↛ 1086line 1085 didn't jump to line 1086, because the condition on line 1085 was never true
1086 request['Password'] = NULL
1087 else:
1088 request['Password']['Buffer'] = password
1089 request['Options'] = options
1090 return dce.request(request)
1092def hNetrValidateName2(dce, nameToValidate, accountName, password, nameType):
1093 request = NetrValidateName2()
1094 request['ServerName'] = '\x00'*10
1095 request['NameToValidate'] = checkNullString(nameToValidate)
1096 request['AccountName'] = checkNullString(accountName)
1097 if password == NULL: 1097 ↛ 1100line 1097 didn't jump to line 1100, because the condition on line 1097 was never false
1098 request['Password'] = NULL
1099 else:
1100 request['Password']['Buffer'] = password
1101 request['NameType'] = nameType
1102 return dce.request(request)
1104def hNetrGetJoinableOUs2(dce, domainNameParam, accountName, password, OUCount):
1105 request = NetrGetJoinableOUs2()
1106 request['ServerName'] = '\x00'*10
1107 request['DomainNameParam'] = checkNullString(domainNameParam)
1108 request['AccountName'] = checkNullString(accountName)
1109 if password == NULL: 1109 ↛ 1112line 1109 didn't jump to line 1112, because the condition on line 1109 was never false
1110 request['Password'] = NULL
1111 else:
1112 request['Password']['Buffer'] = password
1113 request['OUCount'] = OUCount
1114 return dce.request(request)
1116def hNetrAddAlternateComputerName(dce, alternateName, domainAccount, encryptedPassword):
1117 request = NetrAddAlternateComputerName()
1118 request['ServerName'] = '\x00'*10
1119 request['AlternateName'] = checkNullString(alternateName)
1120 request['DomainAccount'] = checkNullString(domainAccount)
1121 if encryptedPassword == NULL: 1121 ↛ 1124line 1121 didn't jump to line 1124, because the condition on line 1121 was never false
1122 request['EncryptedPassword'] = NULL
1123 else:
1124 request['EncryptedPassword']['Buffer'] = encryptedPassword
1125 return dce.request(request)
1127def hNetrRemoveAlternateComputerName(dce, alternateName, domainAccount, encryptedPassword):
1128 request = NetrRemoveAlternateComputerName()
1129 request['ServerName'] = '\x00'*10
1130 request['AlternateName'] = checkNullString(alternateName)
1131 request['DomainAccount'] = checkNullString(domainAccount)
1132 if encryptedPassword == NULL: 1132 ↛ 1135line 1132 didn't jump to line 1135, because the condition on line 1132 was never false
1133 request['EncryptedPassword'] = NULL
1134 else:
1135 request['EncryptedPassword']['Buffer'] = encryptedPassword
1136 return dce.request(request)
1138def hNetrSetPrimaryComputerName(dce, primaryName, domainAccount, encryptedPassword):
1139 request = NetrSetPrimaryComputerName()
1140 request['ServerName'] = '\x00'*10
1141 request['PrimaryName'] = checkNullString(primaryName)
1142 request['DomainAccount'] = checkNullString(domainAccount)
1143 if encryptedPassword == NULL: 1143 ↛ 1146line 1143 didn't jump to line 1146, because the condition on line 1143 was never false
1144 request['EncryptedPassword'] = NULL
1145 else:
1146 request['EncryptedPassword']['Buffer'] = encryptedPassword
1147 return dce.request(request)
1149def hNetrEnumerateComputerNames(dce, nameType):
1150 request = NetrEnumerateComputerNames()
1151 request['ServerName'] = '\x00'*10
1152 request['NameType'] = nameType
1153 return dce.request(request)
1155def hNetrUseAdd(dce, level, infoStruct):
1156 request = NetrUseAdd()
1157 request['ServerName'] = '\x00'*10
1158 request['Level'] = level
1159 request['InfoStruct']['tag'] = level
1160 request['InfoStruct']['UseInfo%d' % level] = infoStruct
1161 return dce.request(request)
1163def hNetrUseEnum(dce, level, resumeHandle = 0, preferredMaximumLength = 0xffffffff):
1164 request = NetrUseEnum()
1165 request['ServerName'] = '\x00'*10
1166 request['InfoStruct']['Level'] = level
1167 request['InfoStruct']['UseInfo']['tag'] = level
1168 request['InfoStruct']['UseInfo']['Level%d'%level]['Buffer'] = NULL
1169 request['PreferredMaximumLength'] = preferredMaximumLength
1170 request['ResumeHandle'] = resumeHandle
1171 return dce.request(request)
1173def hNetrUseGetInfo(dce, useName, level):
1174 request = NetrUseGetInfo()
1175 request['ServerName'] = '\x00'*10
1176 request['UseName'] = checkNullString(useName)
1177 request['Level'] = level
1178 return dce.request(request)
1180def hNetrUseDel(dce, useName, forceLevel=USE_LOTS_OF_FORCE):
1181 request = NetrUseDel()
1182 request['ServerName'] = '\x00'*10
1183 request['UseName'] = checkNullString(useName)
1184 request['ForceLevel'] = forceLevel
1185 return dce.request(request)