Diferencia entre revisiones de «Usuario:Luis.perez/sistemaspyaytozgz/windows»
(→Gestión de usuarios y grupos) |
(→Obtención del interfaz) |
||
(9 revisiones intermedias por el mismo usuario no mostrado) | |||
Línea 17: | Línea 17: | ||
* Wrapper alrededor de pywin32 para hacerla más "pythonic" | * Wrapper alrededor de pywin32 para hacerla más "pythonic" | ||
+ | |||
+ | {{Recursos de la Web |Title=Documentación| | ||
+ | * Documentación del módulo Winsys: http://timgolden.me.uk/python/winsys/contents.html | ||
+ | }} | ||
+ | {{Tip|La documentación no es muy exhaustiva, por lo que es aconsejable tener a mano el propio código de Winsys}} | ||
==== Instalación ==== | ==== Instalación ==== | ||
Línea 66: | Línea 71: | ||
# además de | # además de | ||
reg = registry.Registry(r"HKLM\Software\View\Gvim") | reg = registry.Registry(r"HKLM\Software\View\Gvim") | ||
+ | </source> | ||
+ | |||
+ | ==== Módulo security ==== | ||
+ | |||
+ | Módulo que da acceso y gestiona las ACLs de objetos (ficheros, claves del registro...). Implementa la clase Security. | ||
+ | |||
+ | ===== Obtener el objeto Security ===== | ||
+ | * Puede hacerse mediante la función security: | ||
+ | <source lang="python"> | ||
+ | from winsys import security | ||
+ | sec = security.security(r"c:\windows") | ||
+ | </source> | ||
+ | |||
+ | * o mediante el método security de algunos objetos | ||
+ | |||
+ | <source lang="python"> | ||
+ | f = fs.file ("test") | ||
+ | sec = f.security() | ||
+ | </source> | ||
+ | |||
+ | ===== Listas de control de acceso ===== | ||
+ | |||
+ | <source lang="python"> | ||
+ | sec = security.security(r"c:\windows") | ||
+ | print(sec.dacl.dump()) | ||
+ | </source> | ||
+ | |||
+ | |||
+ | Podemos añadir nuevos permisos: | ||
+ | <source lang="python"> | ||
+ | sec.dacl.append((security.me(), "F", "ALLOW")) | ||
+ | </source> | ||
+ | |||
+ | Constantes: | ||
+ | |||
+ | ACCESS = { | ||
+ | u"R" : constants.GENERIC_ACCESS.READ, | ||
+ | u"W" : constants.GENERIC_ACCESS.WRITE, | ||
+ | u"X" : constants.GENERIC_ACCESS.EXECUTE, | ||
+ | u"C" : constants.GENERIC_ACCESS.READ | constants.GENERIC_ACCESS.WRITE | constants.GENERIC_ACCESS.EXECUTE, | ||
+ | u"F" : constants.GENERIC_ACCESS.ALL | ||
+ | } | ||
+ | |||
+ | ===== Suplantar permisos de usuario ===== | ||
+ | |||
+ | <source lang="python"> | ||
+ | with security.impersonate ("Administrator", "password"): | ||
+ | print(security.me()) | ||
</source> | </source> | ||
Línea 150: | Línea 203: | ||
with new_key.security () as sec: | with new_key.security () as sec: | ||
sec.break_inheritance (copy_first=False) | sec.break_inheritance (copy_first=False) | ||
− | sec.dacl.append(accounts.user("luis", "F", "ALLOW")) | + | sec.dacl.append((accounts.user("luis"), "F", "ALLOW")) |
finally: | finally: | ||
new_key.security().dump () | new_key.security().dump () | ||
Línea 176: | Línea 229: | ||
... | ... | ||
</source> | </source> | ||
+ | |||
+ | La modificación de ambos diccionarios actualiza los entornos | ||
==== Gestión de usuarios y grupos ==== | ==== Gestión de usuarios y grupos ==== | ||
Línea 260: | Línea 315: | ||
<source lang="python"> | <source lang="python"> | ||
− | user = accounts. | + | user = accounts.user("luis") |
− | + | with user: | |
− | + | # ejecutar proceso, modificar archivos... | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
</source> | </source> | ||
{{Tip|En el tutorial sobre accounts se puede apreciar el import | {{Tip|En el tutorial sobre accounts se puede apreciar el import | ||
Línea 305: | Línea 354: | ||
c = wmi.WMI () | c = wmi.WMI () | ||
for i in c.classes: | for i in c.classes: | ||
− | print i | + | print(i) |
</source> | </source> | ||
− | * Como se ve en el ejemplo, se puede obtener información | + | * Como se ve en el ejemplo, se puede obtener información deº qué clases de WMI expone. |
* Para acceder a una de esas clases: | * Para acceder a una de esas clases: | ||
Línea 365: | Línea 414: | ||
for disk in c.query(wql): | for disk in c.query(wql): | ||
print(disk) | print(disk) | ||
+ | </source> | ||
+ | |||
+ | ==== Gestión de procesos ==== | ||
+ | |||
+ | ===== Listar procesos ===== | ||
+ | <source lang="python"> | ||
+ | c = wmi.WMI () | ||
+ | for process in c.Win32_Process (): | ||
+ | print process.ProcessId, process.Name | ||
+ | </source> | ||
+ | |||
+ | ===== Filtrar lista de procesos ===== | ||
+ | <source lang="python"> | ||
+ | for process in c.Win32_Process("firefox.exe"): | ||
+ | print("firefox pid: {}".format(process.ProcessId)) | ||
+ | </source> | ||
+ | |||
+ | ===== Crear un proceso ===== | ||
+ | |||
+ | <source lang="python"> | ||
+ | c = wmi.WMI () | ||
+ | process_id, return_value = c.Win32_Process.Create(CommandLine="firefox.exe") | ||
+ | </source> | ||
+ | |||
+ | ===== Matar un proceso ===== | ||
+ | <source lang="python"> | ||
+ | for process in c.Win32_Process("firefox.exe"): | ||
+ | result = process.terminate() | ||
+ | </source> | ||
+ | |||
+ | o por pid (el anterior ejemplo matará todos los procesos de firefox): | ||
+ | |||
+ | <source lang="python"> | ||
+ | for process in c.Win32_Process(processId=2132): | ||
+ | result = process.terminate() | ||
+ | </source> | ||
+ | |||
+ | ==== Gestión de paquetes ==== | ||
+ | |||
+ | ===== Listado ===== | ||
+ | <source lang="python"> | ||
+ | c = wmi.WMI() | ||
+ | for prod in c.Win32_Product(): | ||
+ | print(prod) | ||
+ | </source> | ||
+ | |||
+ | ===== Filtrado ===== | ||
+ | <source lang="python"> | ||
+ | c = wmi.WMI() | ||
+ | for prod in c.Win32_Product(Name="Python 2.7"): | ||
+ | print(prod) | ||
+ | </source> | ||
+ | |||
+ | ===== Instalación ===== | ||
+ | <source lang="python"> | ||
+ | c.Win32_Product.Install(AllUsers=True, PackageLocation="c:\Downloads\Python-2.7.msi") | ||
+ | </source> | ||
+ | |||
+ | ===== Desinstalación ===== | ||
+ | |||
+ | <source lang="python"> | ||
+ | c = wmi.WMI() | ||
+ | for prod in c.Win32_Product(Name="Python 2.7"): | ||
+ | prod.Uninstall() | ||
</source> | </source> |
Última revisión de 23:54 22 ene 2013
Contenido
- 1 Administración de Windows con python
- 2 Documentación
- 2.1 Instalación
- 2.2 Características comunes del api
- 2.3 Módulo security
- 2.4 Api del registro de windows
- 2.4.1 obtener una key del registro
- 2.4.2 obtener subkey
- 2.4.3 iterator de keys
- 2.4.4 obtener padre:
- 2.4.5 copiar una key del registro
- 2.4.6 crear una key
- 2.4.7 eliminar una key
- 2.4.8 asignar valores del registro
- 2.4.9 obtener valores del registro
- 2.4.10 obtener valores del registro
- 2.4.11 walk dentro de una clave (similar a lo que hace os.walk para ficheros y directorios
- 2.4.12 Add permisos totales a un usuario
- 2.5 Api del entorno de windows
- 2.6 Gestión de usuarios y grupos
- 2.6.1 Obtención de listado de usuarios
- 2.6.2 Obtención de un usuario
- 2.6.3 Creación de un usuario
- 2.6.4 Eliminación de un usuario
- 2.6.5 Obtención de listado de grupos
- 2.6.6 Obtención de un grupo
- 2.6.7 Creación de un grupo
- 2.6.8 Eliminación de un grupo
- 2.6.9 Asociación de un usuario a un grupo
- 2.6.10 Eliminación de un usuario de un grupo
- 2.6.11 Obtener el usuario que está ejecutando el proceso
- 2.6.12 Actuar como otro usuario
- 2.7 Windows Management Instrumentation: WMI
- 3 Documentación
Administración de Windows con python
Python for Windows extensions: PyWin32
Es un wrapper alrededor del api win32 implementado con SWIG.
Instalación de pywin32
a) versión 214 con pip (versión antigua de hace 3 años) b) versión reciente, 218, desde http://sourceforge.net/projects/pywin32/files/pywin32/Build%20218/pywin32-218.win32-py3.3.exe/download
- Usaremos la versión más reciente, con python 3.3
WINSYS
https://github.com/tjguk/winsys
- Wrapper alrededor de pywin32 para hacerla más "pythonic"
|
Instalación
- Instalar pip (instalar distribute primero)
- Descargar e instalar distribute http://python-distribute.org/distribute_setup.py
$ python distribute_setup.py
- Descargar e instalar pip https://raw.github.com/pypa/pip/master/contrib/get-pip.py
$ python get-pip.py
- Instalar PyWin32
- Instalar Winsys
$ pip install WinSys-3.x
Características comunes del api
- La mayoría de clases extienden de core._WinsysObject
- dump _WinSysObject tiene un método dump que devuelve una representación de las estructuras internas del objeto. Ej:
reg = registry.registry(r"HKLM\Software\View\Gvim") >>> reg.dump() { HKLM\Software\View\Gvim access: 983103 }
- Funciones a nivel de módulo: Normalmente, si una clase de un módulo tiene un método, suele existir uno correspondiente a nivel del módulo, a fin de facilitar el uso cuando no se desea tener que crear u obtener el objeto. Ejemplo:
reg = registry.registry(r"HKLM\Software\View\Gvim") reg.delete() # en lugar de lo anterior, podemos hacer directamente: registry.delete(r"HKLM\Software\View\Gvim")
- Métodos factoría: Existen métodos a nivel de módulo para obtener instancias de objetos. Ej:
reg = registry.registry(r"HKLM\Software\View\Gvim") # además de reg = registry.Registry(r"HKLM\Software\View\Gvim")
Módulo security
Módulo que da acceso y gestiona las ACLs de objetos (ficheros, claves del registro...). Implementa la clase Security.
Obtener el objeto Security
- Puede hacerse mediante la función security:
from winsys import security sec = security.security(r"c:\windows")
- o mediante el método security de algunos objetos
f = fs.file ("test") sec = f.security()
Listas de control de acceso
sec = security.security(r"c:\windows") print(sec.dacl.dump())
Podemos añadir nuevos permisos:
sec.dacl.append((security.me(), "F", "ALLOW"))
Constantes:
ACCESS = { u"R" : constants.GENERIC_ACCESS.READ, u"W" : constants.GENERIC_ACCESS.WRITE, u"X" : constants.GENERIC_ACCESS.EXECUTE, u"C" : constants.GENERIC_ACCESS.READ | constants.GENERIC_ACCESS.WRITE | constants.GENERIC_ACCESS.EXECUTE, u"F" : constants.GENERIC_ACCESS.ALL }
Suplantar permisos de usuario
with security.impersonate ("Administrator", "password"): print(security.me())
Api del registro de windows
obtener una key del registro
new_key = registry.registry (r"HKLM\Software\Vim\Gvim") base = registry.registry(r"HKLM\Software") gvim2 = base + "Gvim" # se puede usar el operador + para concatenar
obtener subkey
subk = base.gvim
iterator de keys
for key in base.keys(): print(key) #key es de tipo registry
obtener padre:
parent = key.parent() parent = registry.parent(key)
copiar una key del registro
new_key = registry.copy (r"HKLM\Software\Vim\Gvim", r"HKLM\Software\Vim\Gvim2")
crear una key
gvim2.create("subkey") registry.create(gvim2, "subkey")
eliminar una key
gvim2.delete("subkey") # alternativo: registry.delete(gvim2, "subkey") gvim2.delete() #alternativo: registry.delete(gvim2)
asignar valores del registro
new_key.myvalue = 5 new_key.set_value('myvalue', 2)
obtener valores del registro
print("Obteniendo valores dentro de una key") avalue = new_key.myvalue avalue = new_key.get_value('myvalue')
obtener valores del registro
for name, value in new_key.values(): print("name: {}, value: {}".format(name, value)) values_dict = dict(new_key.values())
walk dentro de una clave (similar a lo que hace os.walk para ficheros y directorios
for key, subkeys, values in base.walk(): #key es de tipo registry #subkeys es una iterator de tipo registry #values es un iterator de tuplas nombre-valor pass
Add permisos totales a un usuario
try: with new_key.security () as sec: sec.break_inheritance (copy_first=False) sec.dacl.append((accounts.user("luis"), "F", "ALLOW")) finally: new_key.security().dump ()
Api del entorno de windows
from winsys import environment
Entorno del usuario
>>>> environment.user() {'TMP': 'C:\\Documents and Settings\\luis\\Temp', 'TEMP':'C:\\Documents and Settings\\luis\\Temp'}
Entorno del sistema
>>>> environment.system() 'NUMBER_OF_PROCESSORS': '1', 'PROCESSOR_IDENTIFIER': 'x86 Family 6 Model 42 Stepping 7, GenuineIntel', 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH', 'windir': 'C:\\WINDOWS', 'PROCESSOR_LEVEL': '6', 'FP_NO_HOST_CHECK': 'NO', 'ComSpec': 'C:\\WINDOWS\\system32\\cmd.exe', 'Path': 'C:\\Python33\\;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\Python33\\Scripts;C:\\C ...
La modificación de ambos diccionarios actualiza los entornos
Gestión de usuarios y grupos
Obtención de listado de usuarios
users = accounts.users()
Obtención de un usuario
user = accounts.user("luis")
Creación de un usuario
accounts.User.create("luis2", "mypassword")
atención: El usuario no se incluye en ningún grupo
Eliminación de un usuario
accounts.user("luis2").delete()
También un objeto Princpal puede usarse:
accounts.principal("luis2").delete()
Obtención de listado de grupos
groups = accounts.local_groups()
Obtención de un grupo
group = accounts.group("Administradores")
ó
group = accounts.local_group("Administradores")
Creación de un grupo
group = accounts.LocalGroup("MyCustomGroup")
Eliminación de un grupo
accounts.local_group("MyCustomGroup").delete()
Asociación de un usuario a un grupo
user = accounts.user("luis2") group = accounts.local_group("Usuarios") group.add(user)
Atención: En la última versión de Winsys parece haber un bug en el api de la clase accounts.User. Aunque existe el método join, el siguiente código no funcionará, debido a que join busca el grupo con accounts.group, el cual devuelve un objeto de tipo Group, no LocalGroup, que no tiene el método add para añadir el usuario a sus miembros:
user = accounts.user("luis2") user.join("Usuarios") # Error!
Eliminación de un usuario de un grupo
user = accounts.user("luis2") group = accounts.local_group("Usuarios") group.remove(user)
Igual que en el caso de añadir usuarios a grupos, el método leave de la clase User presenta el mismo problema que join
Obtener el usuario que está ejecutando el proceso
user = accounts.me()
Actuar como otro usuario
user = accounts.user("luis") with user: # ejecutar proceso, modificar archivos...
from __future__ import with_statement
Es innecesario para versiones de python > 2.5
Windows Management Instrumentation: WMI
- Wrapper alrededor de pywin32 para acceder al api WMI
|
Instalación
http://pypi.python.org/pypi/WMI/#downloads
- Puede instalarse ejecutando el exe instalador, o bien haciendo
python setup.py install
Sobre los sources descargados.
Obtención del interfaz
Basta con importar wmi e invocar a su método WMI.
import wmi c = wmi.WMI () for i in c.classes: print(i)
- Como se ve en el ejemplo, se puede obtener información deº qué clases de WMI expone.
- Para acceder a una de esas clases:
c = wmi.WMI () for os in c.Win32_OperatingSystem(): # Siempre devuelve una lista, aunque sepamos que hay un solo objeto print(os.Caption)
- También se puede acceder a una máquina remota:
c = wmi.WMI("maquinaremota")
- Para poder conectar con otro user/pass:
c = wmi.WMI("MyOtherMachine", user=r"MyOtherMachine\luis", password="mypassword")
ó
remote_connetion = wmi.connect_server ( server="MyOtherMachine", user="luis", password="mypassword" ) c = wmi.WMI(wmi=remote_connection)
- Para conocer atributos del objeto:
c = wmi.WMI () for os in c.Win32_OperatingSystem(): print(os.properties) print(os.methods)
- Se pueden filtrar los objetos que se devuelven, pasando valores de propiedades del objeto:
c = wmi.WMI () for disk in c.Win32_LogicalDisk(Caption="E:"): print(disk) # devolverá solo la unidad "E:"
- Se puede obtener directamente un objeto conociendo su moniker
disks = wmi.WMI(moniker="//./root/cimv2:Win32_LogicalDisk")
- ...y obtener un objeto filtrado:
disks = wmi.WMI(moniker='//./root/cimv2:Win32_LogicalDisk.Description="Mi unidad de red"')
- Usar una consulta WQL
c = wmi.WMI() wql = "SELECT Caption, Description FROM Win32_LogicalDisk WHERE DriveType <> 3" for disk in c.query(wql): print(disk)
Gestión de procesos
Listar procesos
c = wmi.WMI () for process in c.Win32_Process (): print process.ProcessId, process.Name
Filtrar lista de procesos
for process in c.Win32_Process("firefox.exe"): print("firefox pid: {}".format(process.ProcessId))
Crear un proceso
c = wmi.WMI () process_id, return_value = c.Win32_Process.Create(CommandLine="firefox.exe")
Matar un proceso
for process in c.Win32_Process("firefox.exe"): result = process.terminate()
o por pid (el anterior ejemplo matará todos los procesos de firefox):
for process in c.Win32_Process(processId=2132): result = process.terminate()
Gestión de paquetes
Listado
c = wmi.WMI() for prod in c.Win32_Product(): print(prod)
Filtrado
c = wmi.WMI() for prod in c.Win32_Product(Name="Python 2.7"): print(prod)
Instalación
c.Win32_Product.Install(AllUsers=True, PackageLocation="c:\Downloads\Python-2.7.msi")
Desinstalación
c = wmi.WMI() for prod in c.Win32_Product(Name="Python 2.7"): prod.Uninstall()