Hide keyboard shortcuts

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 

32 

33MSRPC_UUID_WKST = uuidtup_to_bin(('6BFFD098-A112-3610-9833-46C3F87E345A', '1.0')) 

34 

35class DCERPCSessionError(DCERPCException): 

36 def __init__(self, error_string=None, error_code=None, packet=None): 

37 DCERPCException.__init__(self, error_string, error_code, packet) 

38 

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 

47 

48################################################################################ 

49# CONSTANTS 

50################################################################################ 

51 

52# 2.2.1.1 JOIN_MAX_PASSWORD_LENGTH 

53JOIN_MAX_PASSWORD_LENGTH = 256 

54 

55# 2.2.1.2 JOIN_OBFUSCATOR_LENGTH 

56JOIN_OBFUSCATOR_LENGTH = 8 

57 

58# 2.2.1.3 MAX_PREFERRED_LENGTH 

59MAX_PREFERRED_LENGTH = 0xffffffff 

60 

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 

68 

69USE_WILDCARD = 0xFFFFFFFF 

70USE_DISKDEV = 0x00000000 

71USE_SPOOLDEV = 0x00000001 

72USE_CHARDEV = 0x00000002 

73USE_IPC = 0x00000003 

74 

75# 3.2.4.9 NetrUseDel (Opnum 10) 

76# Force Level 

77USE_NOFORCE = 0x00000000 

78USE_FORCE = 0x00000001 

79USE_LOTS_OF_FORCE = 0x00000002 

80 

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 

93 

94# 3.2.4.14 NetrUnjoinDomain2 (Opnum 23) 

95# Options 

96NETSETUP_ACCT_DELETE = 0x00000004 

97NETSETUP_IGNORE_UNSUPPORTED_FLAGS = 0x10000000 

98 

99# 3.2.4.15 NetrRenameMachineInDomain2 (Opnum 24) 

100# Options 

101NETSETUP_ACCT_CREATE = 0x00000002 

102NETSETUP_DNS_NAME_CHANGES_ONLY = 0x00001000 

103 

104################################################################################ 

105# STRUCTURES 

106################################################################################ 

107 

108# 2.2.2.1 WKSSVC_IDENTIFY_HANDLE 

109class WKSSVC_IDENTIFY_HANDLE(NDRSTRUCT): 

110 structure = ( 

111 ('Data', WSTR), 

112 ) 

113 

114class LPWKSSVC_IDENTIFY_HANDLE(NDRPOINTER): 

115 referent = ( 

116 ('Data', WKSSVC_IDENTIFY_HANDLE), 

117 ) 

118 

119# 2.2.2.2 WKSSVC_IMPERSONATE_HANDLE 

120class WKSSVC_IMPERSONATE_HANDLE(NDRSTRUCT): 

121 structure = ( 

122 ('Data',WSTR), 

123 ) 

124 

125class LPWKSSVC_IMPERSONATE_HANDLE(NDRPOINTER): 

126 referent = ( 

127 ('Data', WKSSVC_IMPERSONATE_HANDLE), 

128 ) 

129 

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 

137 

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 

147 

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 

155 

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 ) 

165 

166class LPWKSTA_INFO_100(NDRPOINTER): 

167 referent = ( 

168 ('Data', WKSTA_INFO_100), 

169 ) 

170 

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 ) 

181 

182class LPWKSTA_INFO_101(NDRPOINTER): 

183 referent = ( 

184 ('Data', WKSTA_INFO_101), 

185 ) 

186 

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 ) 

198 

199class LPWKSTA_INFO_102(NDRPOINTER): 

200 referent = ( 

201 ('Data', WKSTA_INFO_102), 

202 ) 

203 

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 ) 

243 

244class LPWKSTA_INFO_502(NDRPOINTER): 

245 referent = ( 

246 ('Data', WKSTA_INFO_502), 

247 ) 

248 

249# 2.2.5.5 WKSTA_INFO_1013 

250class WKSTA_INFO_1013(NDRSTRUCT): 

251 structure = ( 

252 ('wki1013_keep_conn', ULONG), 

253 ) 

254 

255class LPWKSTA_INFO_1013(NDRPOINTER): 

256 referent = ( 

257 ('Data', WKSTA_INFO_1013), 

258 ) 

259 

260# 2.2.5.6 WKSTA_INFO_1018 

261class WKSTA_INFO_1018(NDRSTRUCT): 

262 structure = ( 

263 ('wki1018_sess_timeout', ULONG), 

264 ) 

265 

266class LPWKSTA_INFO_1018(NDRPOINTER): 

267 referent = ( 

268 ('Data', WKSTA_INFO_1018), 

269 ) 

270 

271# 2.2.5.7 WKSTA_INFO_1046 

272class WKSTA_INFO_1046(NDRSTRUCT): 

273 structure = ( 

274 ('wki1046_dormant_file_limit', ULONG), 

275 ) 

276 

277class LPWKSTA_INFO_1046(NDRPOINTER): 

278 referent = ( 

279 ('Data', WKSTA_INFO_1046), 

280 ) 

281 

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 } 

296 

297class LPWKSTA_INFO(NDRPOINTER): 

298 referent = ( 

299 ('Data', WKSTA_INFO), 

300 ) 

301 

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 ) 

311 

312# 2.2.5.9 WKSTA_USER_INFO_0 

313class WKSTA_USER_INFO_0(NDRSTRUCT): 

314 structure = ( 

315 ('wkui0_username', LPWSTR), 

316 ) 

317 

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 ) 

326 

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 ) 

371 

372class LPSTAT_WORKSTATION_0(NDRPOINTER): 

373 referent = ( 

374 ('Data', STAT_WORKSTATION_0), 

375 ) 

376 

377# 2.2.5.12 WKSTA_USER_INFO_0_CONTAINER 

378class WKSTA_USER_INFO_0_ARRAY(NDRUniConformantArray): 

379 item = WKSTA_USER_INFO_0 

380 

381class LPWKSTA_USER_INFO_0_ARRAY(NDRPOINTER): 

382 referent = ( 

383 ('Data', WKSTA_USER_INFO_0_ARRAY), 

384 ) 

385 

386class WKSTA_USER_INFO_0_CONTAINER(NDRSTRUCT): 

387 structure = ( 

388 ('EntriesRead', ULONG), 

389 ('Buffer', LPWKSTA_USER_INFO_0_ARRAY), 

390 ) 

391 

392class LPWKSTA_USER_INFO_0_CONTAINER(NDRPOINTER): 

393 referent = ( 

394 ('Data', WKSTA_USER_INFO_0_CONTAINER), 

395 ) 

396 

397# 2.2.5.13 WKSTA_USER_INFO_1_CONTAINER 

398class WKSTA_USER_INFO_1_ARRAY(NDRUniConformantArray): 

399 item = WKSTA_USER_INFO_1 

400 

401class LPWKSTA_USER_INFO_1_ARRAY(NDRPOINTER): 

402 referent = ( 

403 ('Data', WKSTA_USER_INFO_1_ARRAY), 

404 ) 

405 

406class WKSTA_USER_INFO_1_CONTAINER(NDRSTRUCT): 

407 structure = ( 

408 ('EntriesRead', ULONG), 

409 ('Buffer', LPWKSTA_USER_INFO_1_ARRAY), 

410 ) 

411 

412class LPWKSTA_USER_INFO_1_CONTAINER(NDRPOINTER): 

413 referent = ( 

414 ('Data', WKSTA_USER_INFO_1_CONTAINER), 

415 ) 

416 

417# 2.2.5.14 WKSTA_USER_ENUM_STRUCT 

418class WKSTA_USER_ENUM_UNION(NDRUNION): 

419 commonHdr = ( 

420 ('tag', ULONG), 

421 ) 

422 

423 union = { 

424 0: ('Level0', LPWKSTA_USER_INFO_0_CONTAINER), 

425 1: ('Level1', LPWKSTA_USER_INFO_1_CONTAINER), 

426 } 

427 

428class WKSTA_USER_ENUM_STRUCT(NDRSTRUCT): 

429 structure = ( 

430 ('Level', ULONG), 

431 ('WkstaUserInfo', WKSTA_USER_ENUM_UNION), 

432 ) 

433 

434 

435# 2.2.5.15 WKSTA_TRANSPORT_INFO_0_CONTAINER 

436class WKSTA_TRANSPORT_INFO_0_ARRAY(NDRUniConformantArray): 

437 item = WKSTA_TRANSPORT_INFO_0 

438 

439class LPWKSTA_TRANSPORT_INFO_0_ARRAY(NDRPOINTER): 

440 referent = ( 

441 ('Data', WKSTA_TRANSPORT_INFO_0_ARRAY), 

442 ) 

443 

444class WKSTA_TRANSPORT_INFO_0_CONTAINER(NDRSTRUCT): 

445 structure = ( 

446 ('EntriesRead', ULONG), 

447 ('Buffer', LPWKSTA_TRANSPORT_INFO_0_ARRAY), 

448 ) 

449 

450class LPWKSTA_TRANSPORT_INFO_0_CONTAINER(NDRPOINTER): 

451 referent = ( 

452 ('Data', WKSTA_TRANSPORT_INFO_0_CONTAINER), 

453 ) 

454 

455# 2.2.5.16 WKSTA_TRANSPORT_ENUM_STRUCT 

456class WKSTA_TRANSPORT_ENUM_UNION(NDRUNION): 

457 commonHdr = ( 

458 ('tag', ULONG), 

459 ) 

460 

461 union = { 

462 0: ('Level0', LPWKSTA_TRANSPORT_INFO_0_CONTAINER), 

463 } 

464 

465class WKSTA_TRANSPORT_ENUM_STRUCT(NDRSTRUCT): 

466 structure = ( 

467 ('Level', ULONG), 

468 ('WkstaTransportInfo', WKSTA_TRANSPORT_ENUM_UNION), 

469 ) 

470 

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 

475 

476class CHAR_ARRAY(NDRUniFixedArray): 

477 def getDataLen(self, data, offset=0): 

478 return JOIN_OBFUSCATOR_LENGTH 

479 

480class JOINPR_USER_PASSWORD(NDRSTRUCT): 

481 structure = ( 

482 ('Obfuscator', CHAR_ARRAY), 

483 ('Buffer', WCHAR_ARRAY), 

484 ) 

485 

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 

493 

494class PJOINPR_ENCRYPTED_USER_PASSWORD(NDRPOINTER): 

495 referent = ( 

496 ('Data', JOINPR_ENCRYPTED_USER_PASSWORD), 

497 ) 

498 

499# 2.2.5.19 UNICODE_STRING 

500UNICODE_STRING = WSTR 

501class PUNICODE_STRING(NDRPOINTER): 

502 referent = ( 

503 ('Data', UNICODE_STRING), 

504 ) 

505 

506# 2.2.5.20 NET_COMPUTER_NAME_ARRAY 

507class UNICODE_STRING_ARRAY(NDRUniConformantArray): 

508 item = RPC_UNICODE_STRING 

509 

510class PUNICODE_STRING_ARRAY(NDRPOINTER): 

511 referent = ( 

512 ('Data', UNICODE_STRING_ARRAY), 

513 ) 

514 

515class NET_COMPUTER_NAME_ARRAY(NDRSTRUCT): 

516 structure = ( 

517 ('EntriesRead', ULONG), 

518 ('ComputerNames', PUNICODE_STRING_ARRAY), 

519 ) 

520 

521class PNET_COMPUTER_NAME_ARRAY(NDRPOINTER): 

522 referent = ( 

523 ('Data', NET_COMPUTER_NAME_ARRAY), 

524 ) 

525 

526# 2.2.5.21 USE_INFO_0 

527class USE_INFO_0(NDRSTRUCT): 

528 structure = ( 

529 ('ui0_local', LPWSTR), 

530 ('ui0_remote', LPWSTR), 

531 ) 

532 

533class LPUSE_INFO_0(NDRPOINTER): 

534 referent = ( 

535 ('Data', USE_INFO_0), 

536 ) 

537 

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 ) 

549 

550class LPUSE_INFO_1(NDRPOINTER): 

551 referent = ( 

552 ('Data', USE_INFO_1), 

553 ) 

554 

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 ) 

562 

563class LPUSE_INFO_2(NDRPOINTER): 

564 referent = ( 

565 ('Data', USE_INFO_2), 

566 ) 

567 

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 ) 

574 

575class LPUSE_INFO_3(NDRPOINTER): 

576 referent = ( 

577 ('Data', USE_INFO_3), 

578 ) 

579 

580# 2.2.4.2 USE_INFO 

581class USE_INFO(NDRUNION): 

582 commonHdr = ( 

583 ('tag', ULONG), 

584 ) 

585 

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 } 

592 

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 ) 

599 

600class LPUSE_INFO_0_CONTAINER(NDRPOINTER): 

601 referent = ( 

602 ('Data', USE_INFO_0_CONTAINER), 

603 ) 

604 

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 ) 

611 

612class LPUSE_INFO_1_CONTAINER(NDRPOINTER): 

613 referent = ( 

614 ('Data', USE_INFO_1_CONTAINER), 

615 ) 

616 

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 ) 

623 

624class LPUSE_INFO_2_CONTAINER(NDRPOINTER): 

625 referent = ( 

626 ('Data', USE_INFO_2_CONTAINER), 

627 ) 

628 

629# 2.2.5.28 USE_ENUM_STRUCT 

630class USE_ENUM_UNION(NDRUNION): 

631 commonHdr = ( 

632 ('tag', ULONG), 

633 ) 

634 

635 union = { 

636 0: ('Level0', LPUSE_INFO_0_CONTAINER), 

637 1: ('Level1', LPUSE_INFO_1_CONTAINER), 

638 2: ('Level2', LPUSE_INFO_2_CONTAINER), 

639 } 

640 

641class USE_ENUM_STRUCT(NDRSTRUCT): 

642 structure = ( 

643 ('Level', ULONG), 

644 ('UseInfo', USE_ENUM_UNION), 

645 ) 

646 

647################################################################################ 

648# RPC CALLS 

649################################################################################ 

650 

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 ) 

658 

659class NetrWkstaGetInfoResponse(NDRCALL): 

660 structure = ( 

661 ('WkstaInfo',WKSTA_INFO), 

662 ('ErrorCode',ULONG), 

663 ) 

664 

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 ) 

674 

675class NetrWkstaSetInfoResponse(NDRCALL): 

676 structure = ( 

677 ('ErrorParameter',LPULONG), 

678 ('ErrorCode',ULONG), 

679 ) 

680 

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 ) 

690 

691class NetrWkstaUserEnumResponse(NDRCALL): 

692 structure = ( 

693 ('UserInfo',WKSTA_USER_ENUM_STRUCT), 

694 ('TotalEntries',ULONG), 

695 ('ResumeHandle',ULONG), 

696 ('ErrorCode',ULONG), 

697 ) 

698 

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 ) 

708 

709class NetrWkstaTransportEnumResponse(NDRCALL): 

710 structure = ( 

711 ('TransportInfo',WKSTA_TRANSPORT_ENUM_STRUCT), 

712 ('TotalEntries',ULONG), 

713 ('ResumeHandle',ULONG), 

714 ('ErrorCode',ULONG), 

715 ) 

716 

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 ) 

726 

727class NetrWkstaTransportAddResponse(NDRCALL): 

728 structure = ( 

729 ('ErrorParameter',LPULONG), 

730 ('ErrorCode',ULONG), 

731 ) 

732 

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 ) 

742 

743class NetrUseAddResponse(NDRCALL): 

744 structure = ( 

745 ('ErrorParameter',LPULONG), 

746 ('ErrorCode',ULONG), 

747 ) 

748 

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 ) 

757 

758class NetrUseGetInfoResponse(NDRCALL): 

759 structure = ( 

760 ('InfoStruct',USE_INFO), 

761 ('ErrorCode',ULONG), 

762 ) 

763 

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 ) 

772 

773class NetrUseDelResponse(NDRCALL): 

774 structure = ( 

775 ('ErrorCode',ULONG), 

776 ) 

777 

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 ) 

787 

788class NetrUseEnumResponse(NDRCALL): 

789 structure = ( 

790 ('InfoStruct',USE_ENUM_STRUCT), 

791 ('TotalEntries',ULONG), 

792 ('ResumeHandle',LPULONG), 

793 ('ErrorCode',ULONG), 

794 ) 

795 

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 ) 

805 

806class NetrWorkstationStatisticsGetResponse(NDRCALL): 

807 structure = ( 

808 ('Buffer',LPSTAT_WORKSTATION_0), 

809 ('ErrorCode',ULONG), 

810 ) 

811 

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 ) 

819 

820class NetrGetJoinInformationResponse(NDRCALL): 

821 structure = ( 

822 ('NameBuffer',LPWSTR), 

823 ('BufferType',NETSETUP_JOIN_STATUS), 

824 ('ErrorCode',ULONG), 

825 ) 

826 

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 ) 

838 

839class NetrJoinDomain2Response(NDRCALL): 

840 structure = ( 

841 ('ErrorCode',ULONG), 

842 ) 

843 

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 ) 

853 

854class NetrUnjoinDomain2Response(NDRCALL): 

855 structure = ( 

856 ('ErrorCode',ULONG), 

857 ) 

858 

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 ) 

869 

870class NetrRenameMachineInDomain2Response(NDRCALL): 

871 structure = ( 

872 ('ErrorCode',ULONG), 

873 ) 

874 

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 ) 

885 

886class NetrValidateName2Response(NDRCALL): 

887 structure = ( 

888 ('ErrorCode',ULONG), 

889 ) 

890 

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 ) 

901 

902class NetrGetJoinableOUs2Response(NDRCALL): 

903 structure = ( 

904 ('OUCount', LPLONG), 

905 ('OUs',PUNICODE_STRING_ARRAY), 

906 ('ErrorCode',ULONG), 

907 ) 

908 

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 ) 

919 

920class NetrAddAlternateComputerNameResponse(NDRCALL): 

921 structure = ( 

922 ('ErrorCode',ULONG), 

923 ) 

924 

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 ) 

935 

936class NetrRemoveAlternateComputerNameResponse(NDRCALL): 

937 structure = ( 

938 ('ErrorCode',ULONG), 

939 ) 

940 

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 ) 

951 

952class NetrSetPrimaryComputerNameResponse(NDRCALL): 

953 structure = ( 

954 ('ErrorCode',ULONG), 

955 ) 

956 

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 ) 

965 

966class NetrEnumerateComputerNamesResponse(NDRCALL): 

967 structure = ( 

968 ('ComputerNames',PNET_COMPUTER_NAME_ARRAY), 

969 ('ErrorCode',ULONG), 

970 ) 

971 

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} 

998 

999################################################################################ 

1000# HELPER FUNCTIONS 

1001################################################################################ 

1002def checkNullString(string): 

1003 if string == NULL: 

1004 return string 

1005 

1006 if string[-1:] != '\x00': 

1007 return string + '\x00' 

1008 else: 

1009 return string 

1010 

1011def hNetrWkstaGetInfo(dce, level): 

1012 request = NetrWkstaGetInfo() 

1013 request['ServerName'] = '\x00'*10 

1014 request['Level'] = level 

1015 return dce.request(request) 

1016 

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) 

1024 

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) 

1033 

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) 

1041 

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) 

1049 

1050def hNetrGetJoinInformation(dce, nameBuffer): 

1051 request = NetrGetJoinInformation() 

1052 request['ServerName'] = '\x00'*10 

1053 request['NameBuffer'] = nameBuffer 

1054 return dce.request(request) 

1055 

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) 

1068 

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) 

1079 

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) 

1091 

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) 

1103 

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) 

1115 

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) 

1126 

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) 

1137 

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) 

1148 

1149def hNetrEnumerateComputerNames(dce, nameType): 

1150 request = NetrEnumerateComputerNames() 

1151 request['ServerName'] = '\x00'*10 

1152 request['NameType'] = nameType 

1153 return dce.request(request) 

1154 

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) 

1162 

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) 

1172 

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) 

1179 

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)