Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Juan Sanchez en 4 Mayo 2018, 22:49 pm



Título: Obtener permiso para copiar archivo en c:\archivos de prog..\... en dominio
Publicado por: Juan Sanchez en 4 Mayo 2018, 22:49 pm
Saludos a todos los miembros del grupo, he buscado una solución para mi problema y no encontré mucho en la web por eso quiero exponer mi problema para que me puedan ayudar
 y también pueda servir para otros que tienen el mismo problema, tengo un sistema en la institución donde debo lanzar nuevas versiones para los clientes mediante el mismo sistema, hasta ahí todo bien, los clientes reciben la notificación de que hay una nueva versión y hacen clic en actualizar en el mismo sistema, el archivo ejecutable de actualización se descarga y ejecuta, pero los clientes están bajo un dominio y les pide usuario y contraseña del administrador (cosa que es normal eso de pedir contraseña), para ejecutar el programita de actualización que nada mas ni menos que hace es copiar y reemplazar el nuevo ejecutable en c:\Archivos de programa\sistema\ejecutable.exe, el detalle es que son varios clientes que están distribuidos geográficamente en distintos lugares, lo que quisiera que el programita de actualización copie y reemplace en su directorio sin que le pida la contraseña del administrador del dominio y para eso como se puede obtener permisos especiales para hacer esa operación. de tanto indagar encontré un código que hace algo parecido pero es para apagar el equipo con privilegios,
nota: el programita de actualización, esta en vb net y lo que hace es llevar el nuevo ejecutable como recurso incrustado al mismo, y lo que hace es copiar o reemplazar desde su recurso a la unidad c:\Archivos de programa\sistema\ejecutable.exe en el equipo del cliente

Código
  1.  Private Const EWX_LOGOFF As Integer = 0
  2.  Private Const EWX_SHUTDOWN As Integer = 1
  3.  Private Const EWX_REBOOT As Integer = 2
  4.  Private Const EWX_FORCE As Integer = 4
  5.  Private Const TOKEN_ADJUST_PRIVILEGES As Integer = &H20
  6.  Private Const TOKEN_QUERY As Integer = &H8
  7.  Private Const SE_PRIVILEGE_ENABLED As Integer = &H2
  8.  Private Const ANYSIZE_ARRAY As Integer = 1
  9.  Private Const VER_PLATFORM_WIN32_NT As Integer = 2
  10.  Private Structure OSVERSIONINFO
  11.    Dim dwOSVersionInfoSize As Integer
  12.    Dim dwMajorVersion As Integer
  13.    Dim dwMinorVersion As Integer
  14.    Dim dwBuildNumber As Integer
  15.    Dim dwPlatformId As Integer
  16.    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Dim szCSDVersion As String
  17.  End Structure
  18.  Private Structure LUID
  19.    Dim LowPart As Integer
  20.    Dim HighPart As Integer
  21.  End Structure
  22.  Private Structure LUID_AND_ATTRIBUTES
  23.    Dim pLuid As LUID
  24.    Dim Attributes As Integer
  25.  End Structure
  26.  Private Structure TOKEN_PRIVILEGES
  27.    Dim PrivilegeCount As Integer
  28.    Dim laa As LUID_AND_ATTRIBUTES
  29.  End Structure
  30.  Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As IntPtr, ByVal DesiredAccess As IntPtr, ByRef TokenHandle As IntPtr) As Integer
  31.  Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, ByRef lpLuid As LUID) As Integer
  32.  Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Int32, ByVal dwReserved As Int32) As Int32
  33.  <DllImport("advapi32.dll", SetLastError:=True)> Private Function AdjustTokenPrivileges(ByVal TokenHandle As IntPtr, ByVal DisableAllPrivileges As Boolean, ByRef NewState As TOKEN_PRIVILEGES, ByVal BufferLengthInBytes As Integer, ByRef PreviousState As TOKEN_PRIVILEGES, ByRef ReturnLengthInBytes As Integer) As Boolean
  34.  End Function
  35.  <DllImport("Kernel32.dll")> Private Function GetVersionEx(<MarshalAs(UnmanagedType.Struct)> ByRef osinfo As OSVERSIONINFO) As Integer
  36.  End Function
  37.  Private Sub EnableShutDown()
  38.    Dim hProc As IntPtr, hToken As IntPtr, mLUID As LUID, mPriv As TOKEN_PRIVILEGES, mNewPriv As TOKEN_PRIVILEGES
  39.    hProc = Process.GetCurrentProcess.Handle
  40.    OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken)
  41.    LookupPrivilegeValue("", "SeShutdownPrivilege", mLUID)
  42.    mPriv.PrivilegeCount = 1
  43.    mPriv.laa.pLuid = mLUID
  44.    mPriv.laa.Attributes = SE_PRIVILEGE_ENABLED
  45.    Call AdjustTokenPrivileges(hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount))
  46.  End Sub
  47. ' para apagar windows, este codigo hace sin importar el tipo de usuario este en ese momento igual lo apagara si Forzar es True le obliga a apagar
  48. 'como se puede obtener similar permiso para copiar el archivo en un windows que pertenece a un dominio?
  49.  Public Sub ApagarWindows(ByVal Optional Forzar As Boolean = True)
  50.    Dim Flags As Integer = EWX_SHUTDOWN
  51.    If Forzar Then Flags = Flags + EWX_FORCE
  52.    EnableShutDown()
  53.    ExitWindowsEx(Flags, 0)
  54.  End Sub

Intente cambiar
Código
  1. LookupPrivilegeValue("", "SeShutdownPrivilege", mLUID)
por
Código
  1. LookupPrivilegeValue("", "SeRestorePrivilege", mLUID)

que encontré en este link https://foro.elhacker.net/programacion_visual_basic/source_conseguir_privilegios_adjusttokenprivileges-t199668.0.html;wap= (https://foro.elhacker.net/programacion_visual_basic/source_conseguir_privilegios_adjusttokenprivileges-t199668.0.html;wap=) pero no hizo ningún efecto o como se puede hacer?

De antemano les agradezco por compartir el conocimiento.