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rt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    (
