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
Private Const EWX_LOGOFF As Integer = 0 Private Const EWX_SHUTDOWN As Integer = 1 Private Const EWX_REBOOT As Integer = 2 Private Const EWX_FORCE As Integer = 4 Private Const TOKEN_ADJUST_PRIVILEGES As Integer = &H20 Private Const TOKEN_QUERY As Integer = &H8 Private Const SE_PRIVILEGE_ENABLED As Integer = &H2 Private Const ANYSIZE_ARRAY As Integer = 1 Private Const VER_PLATFORM_WIN32_NT As Integer = 2 Private Structure OSVERSIONINFO Dim dwOSVersionInfoSize As Integer Dim dwMajorVersion As Integer Dim dwMinorVersion As Integer Dim dwBuildNumber As Integer Dim dwPlatformId As Integer <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Dim szCSDVersion As String End Structure Private Structure LUID Dim LowPart As Integer Dim HighPart As Integer End Structure Private Structure LUID_AND_ATTRIBUTES Dim pLuid As LUID Dim Attributes As Integer End Structure Private Structure TOKEN_PRIVILEGES Dim PrivilegeCount As Integer Dim laa As LUID_AND_ATTRIBUTES End Structure Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As IntPtr, ByVal DesiredAccess As IntPtr, ByRef TokenHandle As IntPtr) As Integer Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, ByRef lpLuid As LUID) As Integer Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Int32, ByVal dwReserved As Int32) As Int32 <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 End Function <DllImport("Kernel32.dll")> Private Function GetVersionEx(<MarshalAs(UnmanagedType.Struct)> ByRef osinfo As OSVERSIONINFO) As Integer End Function Private Sub EnableShutDown() Dim hProc As IntPtr, hToken As IntPtr, mLUID As LUID, mPriv As TOKEN_PRIVILEGES, mNewPriv As TOKEN_PRIVILEGES hProc = Process.GetCurrentProcess.Handle OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken) LookupPrivilegeValue("", "SeShutdownPrivilege", mLUID) mPriv.PrivilegeCount = 1 mPriv.laa.pLuid = mLUID mPriv.laa.Attributes = SE_PRIVILEGE_ENABLED Call AdjustTokenPrivileges(hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount)) End Sub ' 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 'como se puede obtener similar permiso para copiar el archivo en un windows que pertenece a un dominio? Public Sub ApagarWindows(ByVal Optional Forzar As Boolean = True) Dim Flags As Integer = EWX_SHUTDOWN If Forzar Then Flags = Flags + EWX_FORCE EnableShutDown() ExitWindowsEx(Flags, 0) End Sub
Intente cambiar
Código
por
LookupPrivilegeValue("", "SeShutdownPrivilege", mLUID)
Código
LookupPrivilegeValue("", "SeRestorePrivilege", mLUID)
que encontré en este link 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.