o
    Žõ±jn)  ã                   @   sÀ   d dl Z d dlmZ d dlmZ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 d dlmZ eddd„ƒZG dd„ dƒZdS )é    N)Úlogger)ÚServiceStatusÚ
SMBService)ÚSMBDCEFactory)ÚSMBConnection)ÚDCERPC5Connection)Úscmr)ÚEPM)Ú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)ÚSECURITY_DESCRIPTOR)Ú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)Ú	REMSVCRPCÚ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/servicemanager.pyÚremsvcrpc_from_smb   s   €"r    c                   @   sØ   e Z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d„ Zdd„ Zdd„ Zejfdd„Zdd„ Zdd„ Zdd„ Zdd „ Zejfd!d"„Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ ZdS ).r   c                 C   s$   d| _ tj| _d | _d | _i | _d S )Nz\svcctl)Úservice_pipenamer   ÚMSRPC_UUID_SCMRÚservice_uuidÚdceÚhandleÚservice_handles©Úselfr   r   r   Ú__init__!   s
   
zREMSVCRPC.__init__c                 Ã   s   �| S )Nr   r'   r   r   r   Ú
__aenter__)   s   €zREMSVCRPC.__aenter__c                 Ã   s   �|   ¡ I d H  dS ©N©TN)r   )r(   Úexc_typeÚexcÚ	tracebackr   r   r   Ú	__aexit__,   s   €zREMSVCRPC.__aexit__NTFr   r   r   c              
   Ã   sÐ   �zPt ƒ }| |_|j |¡ |d u r|j t¡ |j ¡ I d H \}}|d ur(|‚|j |j¡I d H \}}|d ur:|‚|du rM| ¡ I d H \}}|d urM|‚|d fW S  tyg } z
d|fW  Y d }~S d }~ww ©NTF)	r   r$   Úset_auth_levelr   ÚconnectÚbindr#   r   Ú	Exception)r   r   r   r   ÚserviceÚ_r   Úer   r   r   Úfrom_rpcconnection0   s,   €
€ÿzREMSVCRPC.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!   r9   Úget_dce_rpcr5   )r   r   r   r   Úrpctransportr6   r   r8   r   r   r   r   K   s   € 
€ÿzREMSVCRPC.from_smbconnectionc              
   Ã   sh   �zt  | j¡I d H \}}|d urd|fW S |d | _W dS  ty3 } z
d |fW  Y d }~S d }~ww )NFÚ
lpScHandler,   )r   ÚhROpenSCManagerWr$   r%   r5   )r(   Úansr   r8   r   r   r   r   ^   s   €

€ÿzREMSVCRPC.openc              
   Ã   s¼   �zF| j rE| jr1| jD ]}z
|  |¡I d H  W q   Y qzt | j | j| ¡I d H  W n   Y z| j  ¡ I d H  W W d S    Y W d S W dS  ty] } z
d |fW  Y d }~S d }~ww r+   )r$   r%   r&   Úclose_servicer   ÚhRCloseServiceHandleÚ
disconnectr5   )r(   Úservice_namer8   r   r   r   r   j   s0   €
þ€ÿzREMSVCRPC.closec              
   C  sä   �zXt  | j| j¡I d H \}}|d ur|‚tt|ƒƒD ];}d }|| d d }zt|| d d ƒ}W n   tj}Y t|| d d d… || d d d… |ƒ}|d fV  qW d S  t	yq } zd |fV  W Y d }~d S d }~ww )Nr   ÚdwCurrentStateÚlpServiceNameéÿÿÿÿÚlpDisplayName)
r   ÚhREnumServicesStatusWr$   r%   ÚrangeÚlenr   ÚUNKNOWNr   r5   )r(   Úrespr   ÚiÚservice_statusÚstater6   r8   r   r   r   Úlist�   s&   €,÷
€ÿzREMSVCRPC.listc              
   Ã   s€   �z(|| j v r
W dS tj| j| j||d�I d H \}}|d ur |‚|d | j |< W dS  ty? } z
d |fW  Y d }~S d }~ww )N)FN)ÚdwDesiredAccessÚlpServiceHandler,   )r&   r   ÚhROpenServiceWr$   r%   r5   )r(   rC   Údesired_accessr?   r   r8   r   r   r   Úopen_service”   s   €
 €ÿzREMSVCRPC.open_servicec              
   Ã   s¶   �zC| j s|  ¡ I d H \}}|d ur|‚|| jvr)|  |¡I d H \}}|d ur)|‚t | j| j| ¡I d H \}}|d ur>|‚| j|= W dS  tyZ } z
d |fW  Y d }~S d }~ww r+   )r%   r   r&   rU   r   rA   r$   r5   ©r(   rC   r7   r   r8   r   r   r   r@   £   s&   €
€ÿzREMSVCRPC.close_servicec              
   Ã   sV  �z“| j s|  ¡ I d H \}}|d ur|‚|| jvr)|  |¡I d H \}}|d ur)|‚t | j| j| ¡I d H \}}|d ur>|‚|d d tjkrwt 	d| ¡ t 
| j| j| ¡I d H \}}|d urc|‚|d d dkrqtjd fW S tjd fW S |d d tjkr�t d| ¡ tjd fW S td|d	  ƒ‚ tyª } z
d |fW  Y d }~S d }~ww )
NÚlpServiceStatusrD   zService %s is in stopped stateÚlpServiceConfigÚdwStartTypeé   zService %s is already runningz%Unknown service state 0x%x - AbortingÚCurrentState)r%   r   r&   rU   r   ÚhRQueryServiceStatusr$   ÚSERVICE_STOPPEDr   ÚinfoÚhRQueryServiceConfigWr   ÚDISABLEDÚSTOPPEDÚSERVICE_RUNNINGÚdebugÚRUNNINGr5   )r(   rC   r7   r   r?   r8   r   r   r   Úcheck_service_status¸   s:   €
€ÿzREMSVCRPC.check_service_statusc              
   Ã   sZ   �z|   |tj¡I d H \}}|d ur|‚W dS  ty, } z
d |fW  Y d }~S d }~ww r+   )Úchange_service_statusr   ÚSERVICE_CONTROL_STOPr5   rV   r   r   r   Ústop_serviceÜ   s   €€ÿzREMSVCRPC.stop_servicec              
   Ã   sÈ   �zL| j s|  ¡ I d H \}}|d ur|‚|| jvr5tj}|tjkr$tj}|  ||¡I d H \}}|d ur5|‚t | j	| j| |¡I d H \}}|d urK|‚W dS  t
yc } z
d |fW  Y d }~S d }~ww r+   )r%   r   r&   r   ÚSERVICE_ALL_ACCESSrg   ÚSERVICE_STOPrU   ÚhRControlServicer$   r5   )r(   rC   rN   r7   r   rT   r8   r   r   r   rf   å   s*   €

 €ÿzREMSVCRPC.change_service_statusc           	   
   Ã   s¨   �z<| j s|  ¡ I d H \}}|d ur|‚tj| j| j |d |d |d |d�I d H \}}|d ur2|‚|d | j|< ||fW S  tyS } z
d |fW  Y d }~S d }~ww )Nú )ÚlpBinaryPathNamerY   rR   )r%   r   r   ÚhRCreateServiceWr$   r&   r5   )	r(   rC   Údisplay_nameÚcommandÚ	starttyper7   r   rL   r8   r   r   r   Úcreate_serviceþ   s   €0
€ÿzREMSVCRPC.create_servicec              
   Ã   s®   �z?| j s|  ¡ I d H \}}|d ur|‚|| jvr)|  |¡I d H \}}|d ur)|‚t | j| j| ¡I d H \}}|d ur>|‚W dS  tyV } z
d |fW  Y d }~S d }~ww r+   )r%   r   r&   rU   r   ÚhRDeleteServicer$   r5   rV   r   r   r   Údelete_service  s$   €
€ÿzREMSVCRPC.delete_servicec              
   Ã   s¾   �zG| j s|  ¡ I d H \}}|d ur|‚|| jvr)|  |¡I d H \}}|d ur)|‚t | j| j| ¡I d H \}}|d ur>|‚t d¡I d H  W dS  t	y^ } z
d |fW  Y d }~S d }~ww )Né   r,   )
r%   r   r&   rU   r   ÚhRStartServiceWr$   ÚasyncioÚsleepr5   rV   r   r   r   Ústart_service!  s&   €
€ÿzREMSVCRPC.start_servicec              
   Ã   s´   �zB| j s|  ¡ I d H \}}|d ur|‚|| jvr)|  |¡I d H \}}|d ur)|‚tj| j| j| tjd�I d H \}}|d urA|‚W dS  tyY } z
d |fW  Y d }~S d }~ww )N)rY   r,   )	r%   r   r&   rU   r   ÚhRChangeServiceConfigWr$   ÚSERVICE_AUTO_STARTr5   rV   r   r   r   Úenable_service6  s$   €
$€ÿzREMSVCRPC.enable_servicec              
   Ã   sÀ   �zH| j s|  ¡ I d H \}}|d ur|‚|| jvr)|  |¡I d H \}}|d ur)|‚t | j| j| ¡I d H \}}|d ur>|‚tj||d�}|d fW S  t	y_ } z
d |fW  Y d }~S d }~ww )N)Úname)
r%   r   r&   rU   r   r_   r$   r   Úfrom_query_resultr5   )r(   rC   r7   r   r?   r6   r8   r   r   r   Ú
get_configJ  s&   €

€ÿzREMSVCRPC.get_configc              
   Ã   sÌ   �zN| j s|  ¡ I d H \}}|d ur|‚|| jvr)|  |¡I d H \}}|d ur)|‚t | j| j| tjd¡I d H \}}|d urA|‚t 	d 
|d ¡¡}|d fW S  tye } z
d |fW  Y d }~S d }~ww )Ni (  ó    ÚlpSecurityDescriptor)r%   r   r&   rU   r   ÚhRQueryServiceObjectSecurityr$   ÚDACL_SECURITY_INFORMATIONr   Ú
from_bytesÚjoinr5   )r(   rC   r7   r   r?   Úresr8   r   r   r   Úget_service_sd_  s&   €
$
€ÿzREMSVCRPC.get_service_sdr1   )Ú__name__Ú
__module__Ú__qualname__r)   r*   r0   Ústaticmethodr   Úboolr9   r   r   r   r   rP   r   ri   rU   r@   re   rh   rf   r{   rr   rt   ry   r|   r   r‡   r   r   r   r   r       s,    $	r   r1   )rw   Úaiosmbr   Úaiosmb.dcerpc.v5.common.servicer   r   Ú0aiosmb.dcerpc.v5.common.connection.smbdcefactoryr   Úaiosmb.connectionr   Úaiosmb.dcerpc.v5.connectionr   Úaiosmb.dcerpc.v5r   Ú'aiosmb.dcerpc.v5.interfaces.endpointmgrr	   Úaiosmb.dcerpc.v5.rpcrtr
   r   r   r   r   r   r   r   Úwinacl.dtyp.security_descriptorr   Ú
contextlibr   r    r   r   r   r   r   Ú<module>   s    (
