o
    Žõ±j|   ã                   @   sÌ   d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZmZmZmZmZmZ d dlmZ eddd„ƒZG dd„ dƒZdS )é    )ÚTupleN)Úlogger)ÚSMBConnection)ÚDCERPC5Connection)Útsch)ÚEPM)ÚSMBDCEFactory)ÚNULL)ÚRPC_C_AUTHN_LEVEL_NONEÚRPC_C_AUTHN_LEVEL_CONNECTÚRPC_C_AUTHN_LEVEL_CALLÚRPC_C_AUTHN_LEVEL_PKTÚRPC_C_AUTHN_LEVEL_PKT_INTEGRITYÚRPC_C_AUTHN_LEVEL_PKT_PRIVACYÚDCERPCExceptionÚRPC_C_AUTHN_GSS_NEGOTIATE)ÚasynccontextmanagerTFc                 C  sR   �t j| |||d�I d H \}}|r|‚z|V  W | ¡ I d H  d S | ¡ I d H  w )N©Ú
auth_levelÚopenÚperform_dummy)ÚTSCHRPCÚfrom_smbconnectionÚclose)Ú
connectionr   r   r   ÚinstanceÚerr© r   ú–/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/aiosmb/dcerpc/v5/interfaces/tschmgr.pyÚtschrpc_from_smb   s   €"r   c                   @   sØ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zed-dede	de	fdd„ƒZ
ed-dede	de	fdd„ƒZd	ejeejfdd„Zdd„ Zdd„ Zdd„ Zd.dd„Zdd„ Zd d!„ Zd.d"d#„Zd/d%d&„Zd'd(„ Zd)d*„ Zd+d,„ Zd	S )0r   c                 C   s   d| _ tj| _d | _d S )Nz\atsvc)Úservice_pipenamer   ÚMSRPC_UUID_TSCHSÚservice_uuidÚdce©Úselfr   r   r   Ú__init__#   s   
zTSCHRPC.__init__c                 Ã   s   �| S ©Nr   r$   r   r   r   Ú
__aenter__(   s   €zTSCHRPC.__aenter__c                 Ã   s   �|   ¡ I d H  dS ©N©TN)r   )r%   Úexc_typeÚexcÚ	tracebackr   r   r   Ú	__aexit__+   s   €zTSCHRPC.__aexit__c              
   Ã   sd   �z| j rz| j  ¡ I d H  W W d S    Y W d S W dS  ty1 } z
d |fW  Y d }~S d }~ww r)   )r#   Ú
disconnectÚ	Exception)r%   Úer   r   r   r   /   s   €þ€ÿzTSCHRPC.closeNTFr   r   r   c              
   Ã   sª   �z=t ƒ }| |_|j |¡ |d u r|j t¡ |j ¡ I d H \}}|d ur(|‚|j |j¡I d H \}}|d ur:|‚|d fW S  tyT } z
d|fW  Y d }~S d }~ww )NF)r   r#   Úset_auth_levelr   ÚconnectÚbindr"   r0   )r   r   r   r   ÚserviceÚ_r   r1   r   r   r   Úfrom_rpcconnection<   s$   €
€ÿzTSCHRPC.from_rpcconnectionc              
   Ã   s‚   �z)|du rt }t| tƒ jd�}tj| ¡ |||d�I dH \}}|dur&|‚|dfW S  ty@ } z
d|fW  Y d}~S d}~ww )z–
		Creates the connection to the service using an established SMBConnection.
		This connection will use the given SMBConnection as transport layer.
		N)Úfilenamer   )r   r   r   r    r7   Úget_dce_rpcr0   )r   r   r   r   Úrpctransportr5   r   r1   r   r   r   r   R   s   € 
€ÿzTSCHRPC.from_smbconnectionc                 Ã   sx   �|d u rt  d¡ ¡ }|d dkrd| }|d u rt}t | j|||||¡I d H \}}|d ur4d |fS |d }||fS )Né   r   ú\ÚpActualPath)ÚosÚurandomÚhexr	   r   ÚhSchRpcRegisterTaskr#   )r%   ÚtemplateÚ	task_nameÚflagsÚsddlÚ
logon_typeÚresr   r   r   r   Úregister_taskd   s   € zTSCHRPC.register_taskc              
   Ã   s¢   �|d dkrd| }t  | j|¡I d H \}}|d urd |fS |d d |d d |d d |d d |d d |d d	 |d d
 |d d |d dœ	}||fS )Nr   r<   ÚpLastRuntimeÚwYearÚwMonthÚ
wDayOfWeekÚwDayÚwHourÚwMinuteÚwSecondÚwMilliseconds)	ÚYearÚMonthÚ	DayOfWeekÚDayÚHourÚMinuteÚSecondÚMilisecondsÚLastReturnCode)r   ÚhSchRpcGetLastRunInfor#   )r%   rC   rG   r   Útr   r   r   Úget_task_last_run_infou   s"   €







÷zTSCHRPC.get_task_last_run_infoc                 Ã   sF   �|d dkrd| }t  | j|¡I dH \}}|durd|fS d|fS )z
		Deletes a task
		r   r<   NFT)r   ÚhSchRpcDeleter#   ©r%   rC   r6   r   r   r   r   Údelete_taskŠ   s   €zTSCHRPC.delete_taskc                 Ã   s6   �|d dkrd| }t  | j|¡I dH \}}d|fS )z
		Starts a task
		r   r<   NT)r   Ú
hSchRpcRunr#   r_   r   r   r   Úrun_task˜   s
   €zTSCHRPC.run_taskr<   c              
   C  óŽ   �z-t  | j|¡I dH \}}|durd|fV  W dS |d D ]}|d  dd¡dfV  qW dS  tyF } zd|fV  W Y d}~dS d}~ww )z5
		Lists all available tasks on the remote machine
		NÚpNamesÚDataú Ú )r   ÚhSchRpcEnumTasksr#   Úreplacer0   ©r%   ÚpathÚrespr   Únamer1   r   r   r   Ú
list_tasks¢   ó   €
ÿ
€þzTSCHRPC.list_tasksc                 Ã   óJ   �|d dkrd| }t  | j|¡I dH \}}|durd|fS |d dfS )z
		Returns the task XML
		r   r<   NÚpXml)r   ÚhSchRpcRetrieveTaskr#   ©r%   rC   rl   r   r   r   r   Úget_task³   ó   €zTSCHRPC.get_taskc                 Ã   rp   )z5
		Returns the selected task's security descriptor
		r   r<   NrE   )r   ÚhSchRpcGetSecurityr#   rs   r   r   r   Úget_task_sdÀ   ru   zTSCHRPC.get_task_sdc              
   C  rc   )z7
		Lists all available folders on the remote machine
		Nrd   re   rf   rg   )r   ÚhSchRpcEnumFoldersr#   ri   r0   rj   r   r   r   Úlist_foldersÍ   ro   zTSCHRPC.list_foldersé
   c                 Ã   sÞ   �|   |¡}|  |¡I dH \}}|durd|fS |  |¡I dH \}}|dur*d|fS 	 |dk r5dtdƒfS |  |¡I dH \}}|durGd|fS |d dkrNn|d8 }t d¡I dH  q+|  |¡I dH \}}|durmd|fS dS )zy
		Executes a list of shell commands by scheduling a new task and starts it.
		At the end the new task will be deleted
		NTr   zmaxwait timeout!rR   é   r*   )Úgen_xmlrH   rb   r0   r]   ÚasyncioÚsleepr`   )r%   ÚcommandsÚmaxwaitrB   rC   r   r6   rG   r   r   r   Úrun_commandsÞ   s.   €
ôzTSCHRPC.run_commandsc                 C   s   d  |  |¡¡S )NaÁ  <?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <Triggers>
	<CalendarTrigger>
	  <StartBoundary>2015-07-15T20:35:13.2757294</StartBoundary>
	  <Enabled>true</Enabled>
	  <ScheduleByDay>
		<DaysInterval>1</DaysInterval>
	  </ScheduleByDay>
	</CalendarTrigger>
  </Triggers>
  <Principals>
	<Principal id="LocalSystem">
	  <UserId>S-1-5-18</UserId>
	  <RunLevel>HighestAvailable</RunLevel>
	</Principal>
  </Principals>
  <Settings>
	<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
	<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
	<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
	<AllowHardTerminate>true</AllowHardTerminate>
	<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
	<IdleSettings>
	  <StopOnIdleEnd>true</StopOnIdleEnd>
	  <RestartOnIdle>false</RestartOnIdle>
	</IdleSettings>
	<AllowStartOnDemand>true</AllowStartOnDemand>
	<Enabled>true</Enabled>
	<Hidden>true</Hidden>
	<RunOnlyIfIdle>false</RunOnlyIfIdle>
	<WakeToRun>false</WakeToRun>
	<ExecutionTimeLimit>P3D</ExecutionTimeLimit>
	<Priority>7</Priority>
  </Settings>
  <Actions Context="LocalSystem">
	{}
  </Actions>
</Task>
)ÚformatÚgen_commands)r%   r   r   r   r   r|     s   'ÙzTSCHRPC.gen_xmlc                 C   s&   d}|D ]}|d  |  |¡¡7 }q|S )Nrg   zQ
	 <Exec>
	  <Command>cmd.exe</Command>
	  <Arguments>/C {}</Arguments>
	 </Exec>)r‚   Ú
xml_escape)r%   r   ÚretÚcommandr   r   r   rƒ   .  s   üzTSCHRPC.gen_commandsc                    s(   ddddddœ‰ d  ‡ fdd	„|D ƒ¡S )
Nz&amp;z&quot;z&apos;z&gt;z&lt;)ú&ú"ú'ú>ú<rg   c                 3   s   � | ]	}ˆ   ||¡V  qd S r'   )Úget)Ú.0Úc©Úreplace_tabler   r   Ú	<genexpr>A  s   € z%TSCHRPC.xml_escape.<locals>.<genexpr>)Újoin)r%   Údatar   r�   r   r„   9  s   ûzTSCHRPC.xml_escape©NTF)r<   )rz   )Ú__name__Ú
__module__Ú__qualname__r&   r(   r.   r   Ústaticmethodr   Úboolr7   r   r   r   ÚTASK_CREATEr	   ÚTASK_LOGON_NONErH   r]   r`   rb   rn   rt   rw   ry   r�   r|   rƒ   r„   r   r   r   r   r   "   s*    



%+r   r”   ) Útypingr   r>   r}   r-   Úaiosmbr   Úaiosmb.connectionr   Úaiosmb.dcerpc.v5.connectionr   Úaiosmb.dcerpc.v5r   Ú'aiosmb.dcerpc.v5.interfaces.endpointmgrr   Ú0aiosmb.dcerpc.v5.common.connection.smbdcefactoryr   Úaiosmb.dcerpc.v5.dtypesr	   Úaiosmb.dcerpc.v5.rpcrtr
   r   r   r   r   r   r   r   Ú
contextlibr   r   r   r   r   r   r   Ú<module>   s     (
