Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eleкtro

#4951
Para entender lo que estás haciendo, primero deberíias leer la documentación de los parámetros que vayas a modificar en el registro de Windows.




TcpAckFrequency - MSDN (aquí, aparte de ser una guía muy completa respecto a la optimizaciónd e la interfáz de red, encontrarás la referencia del parámetro TcpAckFrequency)

CitarThe TcpAckFrequency value specifies the number of ACKs that will be outstanding before the delayed ACK timer is ignored. The TcpAckFrequency value can only be set after installing Hotfix 815230, described in Microsoft Knowledge Base article 815230, "Changing the TcpAckFrequency value to 1 does not have any effect" at http://support.microsoft.com/kb/815230.

Do not change the value of this entry before carefully studying the effect of different values in a test environment.

Recommended value:
   5 for 100 MB networks
   13 MB for 1 GB networks


¿Consecuencias?,
Cómo se explica, aparte de necesitar tener dicha update para que el valor no sea ignorado por el sistema, primero deberías estudiar el efecto que causaría en tu entorno, antes de asignarle un valor, es decir, que deberías llevar a cabo un test de rendimiento en el flujo de datos de tu conexión tra smodificar el valor. Ya que, si por "ocasionar algún daño al PC" nos estamos refiriendo a inestabilidad en la conexión causada por una alteración en el comportamiento del acknowledging, podría ser que si (o podría ser que no).

En el enlace que has linkeado ya epxlican bien la finalidad de dicho parámetro.




TCPNoDelay - MSDN

CitarDisables nagling. Nagling is a TCP feature that combines several small packets into a single, larger packet for more efficient transmission.

By default, Message Queuing (also known as MSMQ) enables nagling on the TCP sockets it uses. This improves overall performance, but it might briefly delay transmission of smaller packets. If the delay is undesirable or unacceptable, then you can add this entry to the registry to disable nagling.

Value    Meaning
0          Nagling is enabled.
1          Nagling is disabled.

¿Consecuencias?,
en resumen, el valor 0 (False) para el parámetro TCPNoDelay tendrá un efecto positivo para la transmisión de paquetes grandes y un efecto negativo para paquetes pequeños, el valor 1 (True) tendrá un efecto positivo para la transmisión de paquetes pequeños, y un efecto negativo para paquetes grandes.




Dicho esto, yo te recomiendo que utilices una aplicación que se llama Leatrix Latency Fix, el nombre ya explica por si mismo su propósito, reducir la latencia (PING) para los juegos.

Lo bueno que tiene esta aplicación, es que aparte de hacerte todo el trabajo de modificar los parámetros de la interfáz de red por ti, en cualquier momento puedes revertir los cambios realizados, es decir, puedes activar la reducción de Ping desde esta app solamente cuando vayas a jugar, y desactivarla al terminar de jugar, sería lo correcto.

Es una herramienta muy usada por los frikis veteranos del WoW, y yo personalmente lo uso en el Counter-Strike y noto cierta mejora (aunque tal vez sea algo psicológico xD)

http://www.leatrix.com/

Saludos!
#4952
Foro Libre / Re: Stop Yulin Festival
21 Junio 2015, 18:22 PM
Cita de: Robertus98 en 21 Junio 2015, 14:15 PMA mi lo que me parece increible es que cualquier payas@ pueda comprar un animal de compañia....los animales deberian estar en libertad constance , ya que eres vegana y luchas por los animales, deberiais empezar por cerrar todas las tiendas de animales en españa...

Cita de: Orubatosu en 21 Junio 2015, 14:48 PMNingún perro domestico dura mucho en libertad, al menos no si lo enfrentas a los depredadores "de verdad" como el lobo. Son especies creadas para vivir con los seres humanos, no le des mas vueltas

Muy cierto lo que dice el compañero @Orubatosu respecto a esto.

Pensar que el perro doméstico está mejor en libertad (en la calle), es un pensamiento equivocado, aparte de por los obvios peligros de otros depredadores (por ejemplo, en ciertas ciudades de USA los lobos acechan las calles por el día y por la noche, parece una selva), el instnto primario del perro a evolucionado para necesitar la ayuda del ser humano, el perro, siempre buscará la ayuda del ser humano para resolver problemas (por ejemplo, "pedirle" que le acerce la comida, o "pedirle"  que le abra una puerta), en cambio, el lobo jamás buscará la ayuda del ser humano e intentará resolver problemas "psicológicos" por si mismo, y el gato simplemente se aprovecha de la ayuda del ser humano, sin llegar a necesitarla realmente para su supervivencia.

Esto que comento ha sido demostrado en muchas ocasiones con experimentos científicos, el perro necesita al humano para tener mayores probabilidades de encontrar alimento, por ende, el perro siempre tendrá mayores oportunidades de sobrevivir si está bajo la protección y la ayuda del ser humano ...es decir, en una casa con humanos, quizás no sea algo muy bueno depender de la ayuda de otra especie para sobrevivir, pero así es cómo han evolucionado los perros y es un hecho que no se debería ignorar.

Y de nuevo, por esto tipo de ignorancia me molestan tanto este tipo de "manifestaciones", "protestas" (o simples afirmaciones) que realmente no favorecen al animal, sino que lo perjudican, ya que en realidad son gente boba, con buena intención ...si, pero boba, por que hablan sin saber de lo que hablan ni mucho menos las consecuencias que tendrían sus actos, así que si alguien quiere ayudar a un animal recolectando firmas, primero que esa persona se haga un favor a si mismo y al animal en cuestión, documentándose sobre todo lo que esté relacionado con la vida de ese animal en particular.

Saludos!
#4953
Creer en la existencia del Area 51 no es ser un conspiranoico, de hecho pensar que no existe es ser un completo inutil, una oveja del ganado del sistema, ya que es obvio que las potencias militares deben tener un lugar "secreto", prohibido al público, para llevar a cabo sus experimentos y ponerlos en práctica (ej: el desarrollo de nuevos prototipos de aviones), creer lo contrario a esto, es lo mismo que no saber nada sobre el mundo en el que estás viviendo, ni sobre quienes lo gobiernan, ni cómo lo hacen, ni nada de nada.

Ahora, del irrefutable hecho de que existan bases secretas militares (en cada país), a suponer que hagan experimentos con alienígenas, eso ya es otra historia, la existencia de una base militar secreta no evidencia que los secretos estén relacionados con diseccionar alienígenas o hacer ingeniería inversa a tecnología alienígena, que podría ser (sin duda, podria ser, ya que los aliens existen), pero no es algo que se pueda afirmar con certeza.

Y si... yo tampoco entiendo que tipo de noticia es esta, ya que la ubicación del Area 51 (o al menos, la base militar que aparece en Nevada) siempre ha sido conocida, ya sea esa base el real "Area 51" o no lo sea, se sabe que al menos esa base es una base militar "secreta", ya que tienen restringido el acceso por tierra y aire (con orden de disparar antes de preguntar en caso de aire, por ejemplo avionetas de civiles) a cualquier tipo de civil no autorizado a acceder a la base y/o a la inmensa zona del desierto que rodea esa base.

Saludos!
#4954
Foro Libre / Re: Stop Yulin Festival
21 Junio 2015, 05:19 AM
Cita de: El_Andaluz en 21 Junio 2015, 04:06 AMEngel lex: Te referirás a esta vaca verdad

¡Salvemos las vacas!. ¡NOW!.





















.
..
...excepto esta:




Muuuuu... :silbar:
#4955
Foro Libre / Re: Stop Yulin Festival
21 Junio 2015, 02:39 AM
Cita de: Constance en 21 Junio 2015, 02:26 AMYo----Yo si qeu intento no pisarlas y a veces les echo migas de pan, son animalitos que no hacen mal a nadie

Me parece admirable (sin sarcasmo), de hecho no me lo esperaba, aunque yo hago lo mismo con casi todo bicho viviente, pero a donde quería llegar a parar con ese comentario es que seguro que encontraría otro ejemplo donde harías todo lo contraría a intentar no matar sin querer o sin "pena", ya sea con ratas, cucarachas, arañas, serpientes, abejas, plantas, u otro ser vivo...

Cita de: Constance en 21 Junio 2015, 02:26 AMUn depredador mata o muere, un humano tiene alternativas

Por qué tú lo digas, Constance. El humano es un depredador, depredador adaptado a cualquier tipo de entorno, sigue siendo un depredador, no un Dios que pueda elegir no morir de hambruna sin matar.

Saludos!
#4956
Foro Libre / Re: Stop Yulin Festival
21 Junio 2015, 02:01 AM
Cita de: Constance en 21 Junio 2015, 01:52 AMImagina que alguien mata a tu perro , no sé si lo tienes y luego te dice que se lo ha comido porque no tenia nada que llevarse a la boca?
Qué harias? ....lo entenderías ??

Entenderlo si, ya que el ser humano debe alimentarse cómo carnívoro que es, ahora, ¿aceptarlo?, no, seguramente le rompería las dos piernas para dejarle paralítico y le haría una vasectomía, ya que en esas circunstancias se podría decir que ha matado a un miembro de mi familia (habiendo podido evitarlo comiendo cualquier otra cosa que no fuese mi perro).

Pero, es que ese tipo de argumento que das carece de sentido común, tú lo que haces es mezclar los sentimientos de pena, con las necesidades básicas de los seres vivos;
las hormigas también tienen familia que les espera en su hormiguero, y seguro que no andas por las calles mirando hacia el suelo para no pisar ninguna.

El hecho es que se está matando para alimentar a seres humanos, eso es lo único que tiene relevancia en este asunto ...indiferentemente de si ese perro es un perro vagabundo, o es un perro pérdido con una familia detrás que está esperando que regrese a su hogar (aunque, pobrecito en ese caso, da pena, lo se).

Hay muchas cosas que si estan mal y son inhumanas... particulármente las condiciones en que mantienen a esos perros, pero protestar por el hecho de comer carne (de perro, o de lo que sea), me parece absurdo, e hipócrita.

Saludos!
#4957
Foro Libre / Re: Stop Yulin Festival
21 Junio 2015, 01:47 AM
Cita de: Constance en 21 Junio 2015, 00:25 AMhervirán vivos MILLONES DE PERROS para comerlos un sufrimiento inimaginable ..
esta ATROCIDAD

LOS PERROS Y GATOS, no son COMIDA , SON FAMILIA y AMIGOS

Tú misma lo has dicho, para comerlos, entonces, ¿donde está la atrocidad, Constance?.

Toda carne es comida para un ser carnívoro, ¿o vosotros, los "animalistas" cómo dices, qué soys? (aparte de pseudo-vegetarianos).

Si ese es el motivo de la recolecta de firmas, es decir, que "los perros y los gatos no son comida", entonces esto no tiene ni pies ni cabeza, es ridículo, si que son comida, y sino, mira a los chinos cómo comen.

¿?




Cita de: Constance en 21 Junio 2015, 00:25 AMpensad en vuestra mascota arrojada a un cacerola de agua hirviendo.. eso es lo que va a pasar con muchos inocentes

La cuestión es que en China, los perros sirven para ALIMENTAR a muchos seres humanos, muchos de los cuales tal vez no puedan llevarse ninguna otra cosa a la boca y se mueran de hambre, ah, pero claro... eso no le importa a los ""animalistas"", ¿verdad?. ( "salvemos a los perros y condenemos a los humanos" )

Ha sido un argumento algo extremo (aunque en esencia es eso, privar a los humanos de la comida para salvar a los animales), pero ahora intentaré hacerte reflexionar con algo más realista, a ti, y a todos...

Y dime tú, imaginate que realmente con esas firmas consiguierais algo, dime, ¿qué pasaría con todos esos cánidos y felinos si no se los comen en el festival?,
¿realmente crees que les esperaría un futuro mejor?, ¿DE VERDAD CREES QUE DETENER UN EVENTO CÓMO EL DE YULIN SIGNIFICA SALVAR VIDAS?,
¡No!, los perros y los gatos volverían a las jaulas para comerlos otro día, es decir, solo conseguiriais retrasar la muerte del animal, y eso significa alargar la agonia y el sufrimiento del animal,
no hay nada de bueno en ello (aparte de la intención), y por ese motivo yo jamás firmaría para algo así, a pesar de que soy un amante de los animales ...tengo mi cordura y creo estar usándola correcta y firmemente, algo que parece escasear en los argumentos de tú petición de firmas.




Cita de: Constance en 21 Junio 2015, 00:25 AMquien sabe si tendrán una oportunidad??

¿Una oportunidad de que?, por que una oportunidad de vivir ya te digo que no, todos esos perros ya están condenados, enjaulados.

¿Eso es lo que buscais con estas firmas, una oportunidad para el animal?

Si realmente quereis recolectar firmas para algo positivo, para un bien estar de los animales en general, entonces hacedlo para conseguir mejorar las condiciones en las que los chinos tratan (torturan) a los animales antes de comérselos, eso si que tiene delito, y no el hecho de comérselos, no me jodas, que eso es algo inevitable y natural, usemos un poco el razonamiento, el animal es carne, y la carne se come.

Doy por supuesto que nada de lo que he dicho servirá para que lo veas de otro modo, ya que.... la gente que piensa y actua de esta manera... la considero ciegos, pero bueno, yo ya lo he intentado.

A mi este tipo de cosas me fastidian mucho, por que con gente que hace estas cosas y actua sin pensar, al final el mundo va a la inversa, hacia el camino equivocado, eligiendo a partidos políticos equivocados, y consiguiendo perjudicar a los demás con una falsa sensación de estar haciendo lo correcto, cuando en realidad es todo lo contrario.

Mi opinión.

Saludos!
#4958
Foro Libre / Re: Stop Yulin Festival
21 Junio 2015, 01:08 AM
Dime tú, imaginemos por un instante que realmente conseguiis detener el evento.

¿Qué crees que habreis conseguido al hacerlo?.

¿Por que debería una persona firmar para detener ese evento?,
¿qué razones me das para hacerlo? (ya que, que amemos a los perros por mascota no es una razón),
¿Qué beneficios le aportaría el anmal, si se detiene ese evento?.

¿El motivo principal por el que supuestamente debemos querer detener el evento es que: "Los perros y los gatos no son comida, son familia y amigos"?.
( Si es que a eso se le puede llamar motivo... )

A mi me parece que ni siquiera habeis pensado en los pros y/o los contras, ni en las consecuencias que tendría la detención de ese evento, que simplemente veis a un animal a la parrilla y ya no razonais, estos argumentos y esta "manifestación" me recuerdan a las femi-nazis, es decir, una tontería muy grande, pero bueno, te pregunto para estar seguro, a ver cuales son tus argumentos, antes de exponerte los mios para intentar demostrarte que esta recolecta de firma, a parte de no ser muy cuerda, es una muy mala idea.

Espero tu respuesta a todo esto.

PD: Un amante de los cánidos.

Saludos!
#4959
Cita de: javiert239 en 20 Junio 2015, 20:57 PMExiste alguna forma de fucionar esos archivos de forma que las lineas queden en sus lugares correspondietes? Parecia algo bastante sencillo, pero el otro dia le di un millon de vueltas y no encotre ninguna forma.

En Batch sería algo MUY, MUY tedioso (e ineficiente) ya que no tiene soporte para Arrays; En cualquier otro lenguaje de verdad, sería algo muy sencillo.

Una manera general de llevar a cabo esa tarea sería iterar con un búcle las lineas de texto del primer archivo para añadir esas lineas a un Array, una vez hecho esto, ya tienes una colección indizada en la que poder comprobar si un elemento está vacío o no, para reemplazarlo/fusionarlo por el elemento con el mismo índice al iterar las lineas del segundo archivo.

Pseudo-Código:

declare linesCol(Array) = Null
declare mixedLinesCol(Array) = Null
declare index(Int32) = 0

For Each line(String) in textfile1.ReadToEnd:
   linesCol1(Index) = line
   Index += 1
End For

Index = 0 # Resetear el contador.
For each line(String) in textfile2.ReadToEnd:

   # Si la linea no está vacía, reemplazar por la linea original (o añadirla).
   if line.IsNotEmpty() Then
       linesCol1(Index) = line
   End If

   Index += 1
End For





Se que no es Batch, pero desarrollarlo en Batch sería perder el tiempo por que hay muchas mejores opciones, prefiero aportarte una alternativa mejor, mostrándote este código funcional (y eficiente) desarrollado en VB.NET:
Código (vbnet) [Seleccionar]
Dim textLineCol1 As IEnumerable(Of String) =
   File.ReadAllLines("Archivo 1.txt", Encoding.Default)

Dim textLineCol2 As IEnumerable(Of String) =
   File.ReadAllLines("Archivo 2.txt", Encoding.Default)

Dim mixedLineCol As New List(Of String)

For index As Integer = 0 To (textLineCol2.Count - 1)

   Dim curLine As String = textLineCol2(index)

   If (textLineCol1.Count <= index) OrElse (Not String.IsNullOrWhiteSpace(curLine)) Then
       mixedLineCol.Add(curLine)

   Else
       mixedLineCol.Add(textLineCol1(index))

   End If

Next index

File.WriteAllLines("Fusionado.txt", mixedLineCol, Encoding.Default)


Archivo 1.txt:
Código (ini) [Seleccionar]
Linea1

Linea 3

Linea 5


Archivo 2.txt:
Código (ini) [Seleccionar]

Linea 2

Linea 4
Linea5 - Nueva
Linea 6


Archivo Combinado.txt:
Código (ini) [Seleccionar]
Linea1
Linea 2
Linea 3
Linea 4
Linea5 - Nueva
Linea 6


Saludos!
#4960
UserAccountUtil.vb, una class para realizar tareas comunes relacioandas con las cuentas de usuario (LOCALES) de Windows.

Diagrama de Class:


Código fuente:
Código (vbnet) [Seleccionar]
' ***********************************************************************
' Author   : Elektro
' Modified : 20-June-2015
' ***********************************************************************
' <copyright file="UserAccountUtil.vb" company="Elektro Studios">
'     Copyright (c) Elektro Studios. All rights reserved.
' </copyright>
' ***********************************************************************

#Region " Public Members Summary "

#Region " Properties "

' UserAccountUtil.CurrentUser As UserPrincipal
' UserAccountUtil.CurrentUserIsAdmin As Boolean

#End Region

#Region " Functions "

' UserAccountUtil.Create(String, String, String, String, Boolean, Boolean) As UserPrincipal
' UserAccountUtil.FindProfilePath(SecurityIdentifier) As String
' UserAccountUtil.FindProfilePath(String) As String
' UserAccountUtil.FindSid(String) As SecurityIdentifier
' UserAccountUtil.FindUser(SecurityIdentifier) As UserPrincipal
' UserAccountUtil.FindUser(String) As UserPrincipal
' UserAccountUtil.FindUsername(SecurityIdentifier) As String
' UserAccountUtil.GetAllUsers() As List(Of UserPrincipal)
' UserAccountUtil.IsAdmin(String) As Boolean
' UserAccountUtil.IsMemberOfGroup(String, String) As Boolean
' UserAccountUtil.IsMemberOfGroup(String, WellKnownSidType) As Boolean

#End Region

#Region " Methods "

' UserAccountUtil.Add(String, String, String, String, Boolean, Boolean, WellKnownSidType)
' UserAccountUtil.Add(UserPrincipal, WellKnownSidType)
' UserAccountUtil.Delete(String)

#End Region

#End Region

#Region " Option Statements "

Option Strict On
Option Explicit On
Option Infer Off

#End Region

#Region " Imports "

Imports System
Imports System.Collections.Generic
Imports System.DirectoryServices.AccountManagement
Imports System.Linq
Imports System.Security.Principal

#End Region

''' <summary>
''' Contains related Windows user-account utilities.
''' </summary>
Public NotInheritable Class UserAccountUtil

#Region " Properties "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Gets an <see cref="UserPrincipal"/> object that represents the current user.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <value>
   ''' An <see cref="UserPrincipal"/> object that represents the current user.
   ''' </value>
   ''' ----------------------------------------------------------------------------------------------------
   Public Shared ReadOnly Property CurrentUser As UserPrincipal
       Get
           If UserAccountUtil.currentUserB Is Nothing Then
               UserAccountUtil.currentUserB = UserAccountUtil.FindUser(Environment.UserName)
           End If
           Return UserAccountUtil.currentUserB
       End Get
   End Property
   ''' <summary>
   ''' (Backing Field)
   ''' Gets an <see cref="UserPrincipal"/> object that represents the current user.
   ''' </summary>
   Private Shared currentUserB As UserPrincipal

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Gets a value that indicates whether the current user has Administrator privileges.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <value>
   ''' A value that indicates whether the current user has Administrator privileges.
   ''' </value>
   ''' ----------------------------------------------------------------------------------------------------
   Public Shared ReadOnly Property CurrentUserIsAdmin As Boolean
       Get
           Using group As GroupPrincipal =
               GroupPrincipal.FindByIdentity(CurrentUser.Context,
                                             IdentityType.Sid,
                                             New SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, Nothing).Value)

               Return UserAccountUtil.CurrentUser.IsMemberOf(group)
           End Using
       End Get
   End Property

#End Region

#Region " Constructors "

   ''' <summary>
   ''' Prevents a default instance of the <see cref="UserAccountUtil"/> class from being created.
   ''' </summary>
   Private Sub New()
   End Sub

#End Region

#Region " Public Methods "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <remarks>
   ''' Title : Get all user-accounts.
   ''' Author: Elektro
   ''' Date  : 20-June-2015
   ''' </remarks>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <example>
   ''' Dim users As List(Of UserPrincipal) = UserAccountUtil.GetAllUsers()
   ''' </example>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Find and returns all the user accounts of the current machine context.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <returns>
   ''' A <see cref="List(Of UserPrincipal)"/> collection that contains the users.
   ''' </returns>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Public Shared Function GetAllUsers() As List(Of UserPrincipal)

       Dim context As New PrincipalContext(ContextType.Machine)

       Using user As New UserPrincipal(context)

           Using searcher As New PrincipalSearcher(user)

               Return searcher.FindAll.Cast(Of UserPrincipal).ToList

           End Using ' searcher

       End Using ' user

   End Function

   ''' ----------------------------------------------------------------------------------------------------
   ''' <remarks>
   ''' Title : Find user-account by name.
   ''' Author: Elektro
   ''' Date  : 19-June-2015
   ''' </remarks>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <example>
   ''' Dim user As UserPrincipal = UserAccountUtil.FindUser(username:="Administrator")
   ''' </example>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Finds an user account that matches the specified name in the current machine context.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="username">
   ''' The user name to find.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <returns>
   ''' An <see cref="UserPrincipal"/> object that contains the user data.
   ''' </returns>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <exception cref="ArgumentException">
   ''' User not found.;username
   ''' </exception>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Public Shared Function FindUser(ByVal username As String) As UserPrincipal

       Dim context As New PrincipalContext(ContextType.Machine)

       Using user As New UserPrincipal(context)

           Using searcher As New PrincipalSearcher(user)

               Try
                   Return (From p As Principal In searcher.FindAll
                           Where p.Name.Equals(username, StringComparison.OrdinalIgnoreCase)).
                           Cast(Of UserPrincipal).
                           First

               Catch ex As InvalidOperationException
                   Throw New ArgumentException(message:="User not found.", paramName:="username", innerException:=ex)

               End Try

           End Using ' searcher

       End Using ' user

   End Function

   ''' ----------------------------------------------------------------------------------------------------
   ''' <remarks>
   ''' Title : Find user-account by SID.
   ''' Author: Elektro
   ''' Date  : 19-June-2015
   ''' </remarks>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <example>
   ''' Dim user As UserPrincipal = UserAccountUtil.FindUser(sid:=New SecurityIdentifier("S-1-5-21-1780771175-1208154119-2269826705-500"))
   ''' </example>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Finds an user account that matches the specified security identifier (SID) in the current machine context.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="sid">
   ''' A <see cref="SecurityIdentifier"/> (SID) object.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <returns>
   ''' An <see cref="UserPrincipal"/> object that contains the user data.
   ''' </returns>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Public Shared Function FindUser(ByVal sid As SecurityIdentifier) As UserPrincipal

       Dim context As New PrincipalContext(ContextType.Machine)

       Using user As New UserPrincipal(context)

           Using searcher As New PrincipalSearcher(user)

               Try
                   Return (From p As Principal In searcher.FindAll
                           Where p.Sid.Value.Equals(sid.Value, StringComparison.OrdinalIgnoreCase)).
                           Cast(Of UserPrincipal).
                           First

               Catch ex As InvalidOperationException
                   Throw New ArgumentException(message:="User not found.", paramName:="username", innerException:=ex)

               End Try

           End Using ' searcher

       End Using ' user

   End Function

   ''' ----------------------------------------------------------------------------------------------------
   ''' <remarks>
   ''' Title : Find user-account name by SID.
   ''' Author: Elektro
   ''' Date  : 19-June-2015
   ''' </remarks>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <example>
   ''' Dim username As String = UserAccountUtil.FindUsername(sid:=New SecurityIdentifier("S-1-5-21-1780771175-1208154119-2269826705-500"))
   ''' </example>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Finds the username of the specified security identifier (SID) in the current machine context.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="sid">
   ''' A <see cref="SecurityIdentifier"/> (SID) object.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <returns>
   ''' The username.
   ''' </returns>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Public Shared Function FindUsername(ByVal sid As SecurityIdentifier) As String

       Using user As UserPrincipal = UserAccountUtil.FindUser(sid)

           Return user.Name

       End Using

   End Function

   ''' ----------------------------------------------------------------------------------------------------
   ''' <remarks>
   ''' Title : Find user-account SID by username.
   ''' Author: Elektro
   ''' Date  : 19-June-2015
   ''' </remarks>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <example>
   ''' Dim sid As SecurityIdentifier = UserAccountUtil.FindSid(username:="Administrator"))
   ''' </example>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Finds the security identifier (SID) of the specified username account in the current machine context.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="username">
   ''' The user name.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <returns>
   ''' A <see cref="SecurityIdentifier"/> (SID) object.
   ''' </returns>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Public Shared Function FindSid(ByVal username As String) As SecurityIdentifier

       Return UserAccountUtil.FindUser(username).Sid

   End Function

   ''' ----------------------------------------------------------------------------------------------------
   ''' <remarks>
   ''' Title : Find user-account's profile path by username.
   ''' Author: Elektro
   ''' Date  : 19-June-2015
   ''' </remarks>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <example>
   ''' Dim profilePath As String = UserAccountUtil.FindProfilePath(username:="Administrator"))
   ''' </example>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Finds the profile directory path of the specified username account in the current machine context.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="username">
   ''' The user name to find.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <returns>
   ''' The profile directory path.
   ''' </returns>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Public Shared Function FindProfilePath(ByVal userName As String) As String

       Using user As UserPrincipal = UserAccountUtil.FindUser(userName)

           Return CStr(My.Computer.Registry.GetValue(String.Format("HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\{0}",
                                                                   user.Sid.Value),
                                                                   "ProfileImagePath", ""))

       End Using

   End Function

   ''' ----------------------------------------------------------------------------------------------------
   ''' <remarks>
   ''' Title : Find user-account's profile path by SID.
   ''' Author: Elektro
   ''' Date  : 19-June-2015
   ''' </remarks>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <example>
   ''' Dim profilePath As String = UserAccountUtil.FindProfilePath(sid:=New SecurityIdentifier("S-1-5-21-1780771175-1208154119-2269826705-500"))
   ''' </example>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Finds the profile directory path of the specified username account in the current machine context.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="sid">
   ''' A <see cref="SecurityIdentifier"/> (SID) object.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <returns>
   ''' The profile directory path.
   ''' </returns>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Public Shared Function FindProfilePath(ByVal sid As SecurityIdentifier) As String

       Using user As UserPrincipal = UserAccountUtil.FindUser(sid)

           Return CStr(My.Computer.Registry.GetValue(String.Format("HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\{0}",
                                                                   user.Sid.Value),
                                                                   "ProfileImagePath", ""))

       End Using

   End Function

   ''' ----------------------------------------------------------------------------------------------------
   ''' <remarks>
   ''' Title : User is Admin?.
   ''' Author: Elektro
   ''' Date  : 19-June-2015
   ''' </remarks>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <example>
   ''' Dim userIsAdmin As Boolean = UserAccountUtil.IsAdmin(username:="Administrator")
   ''' </example>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Determines whether an user-account of the current machine context is an Administrator.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="username">
   ''' The user name.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <returns>
   ''' <c>True</c> if the user is an Administrator, otherwise, <c>False</c>.
   ''' </returns>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Public Shared Function IsAdmin(ByVal username As String) As Boolean

       Using user As UserPrincipal = UserAccountUtil.FindUser(username)

           Using group As GroupPrincipal = GroupPrincipal.FindByIdentity(user.Context, IdentityType.Sid, New SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, Nothing).Value)

               Return user.IsMemberOf(group)

           End Using ' group

       End Using ' user

   End Function

   ''' ----------------------------------------------------------------------------------------------------
   ''' <remarks>
   ''' Title : User is member of group...?.
   ''' Author: Elektro
   ''' Date  : 19-June-2015
   ''' </remarks>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <example>
   ''' Dim userIsGuest As Boolean = UserAccountUtil.IsMemberOfGroup(username:="Administrator", groupSid:=WellKnownSidType.BuiltinGuestsSid)
   ''' </example>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Determines whether an user-account of the current machine context is a member of the specified group.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="username">
   ''' The user name.
   ''' </param>
   '''
   ''' <param name="groupSid">
   ''' A <see cref="WellKnownSidType"/> security identifier (SID) that determines the account group.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <returns>
   ''' <c>True</c> if the user is a member of the specified group, otherwise, <c>False</c>.
   ''' </returns>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Public Shared Function IsMemberOfGroup(ByVal username As String,
                                          ByVal groupSid As WellKnownSidType) As Boolean

       Using user As UserPrincipal = UserAccountUtil.FindUser(username)

           Using group As GroupPrincipal = GroupPrincipal.FindByIdentity(user.Context, IdentityType.Sid, New SecurityIdentifier(groupSid, Nothing).Value)

               Return user.IsMemberOf(group)

           End Using ' group

       End Using ' user

   End Function

   ''' ----------------------------------------------------------------------------------------------------
   ''' <remarks>
   ''' Title : User is member of group...?.
   ''' Author: Elektro
   ''' Date  : 19-June-2015
   ''' </remarks>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <example>
   ''' Dim userIsGuest As Boolean = UserAccountUtil.IsMemberOfGroup(username:="Administrator", groupname:="Guests")
   ''' </example>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Determines whether an user-account of the current machine context is a member of the specified group.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="username">
   ''' The user name.
   ''' </param>
   '''
   ''' <param name="groupname">
   ''' The name of thehe group.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <returns>
   ''' <c>True</c> if the user is a member of the specified group, otherwise, <c>False</c>.
   ''' </returns>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Public Shared Function IsMemberOfGroup(ByVal username As String,
                                          ByVal groupname As String) As Boolean

       Using user As UserPrincipal = UserAccountUtil.FindUser(username)

           Using group As GroupPrincipal = GroupPrincipal.FindByIdentity(user.Context, IdentityType.Name, groupname)

               Return user.IsMemberOf(group)

           End Using ' group

       End Using ' user

   End Function

   ''' ----------------------------------------------------------------------------------------------------
   ''' <remarks>
   ''' Title : Create user-account.
   ''' Author: Elektro
   ''' Date  : 19-June-2015
   ''' </remarks>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <example>
   ''' Dim user as UserPrincipal = UserAccountUtil.Create(username:="Elektro",
   '''                                                    password:="",
   '''                                                    displayName:="Elektro Account.",
   '''                                                    description:="This is a test user-account.",
   '''                                                    canChangePwd:=True,
   '''                                                    pwdExpires:=False,
   '''                                                    groupSid:=WellKnownSidType.BuiltinAdministratorsSid)
   ''' </example>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Creates a new user account in the current machine context.
   ''' This function does NOT adds a new user in the current machine.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="username">
   ''' The user name.
   ''' </param>
   '''
   ''' <param name="password">
   ''' The user password.
   ''' If this value is empty, account is set to don't require any password.
   ''' </param>
   '''
   ''' <param name="displayName">
   ''' The display name of the user account.
   ''' </param>
   '''
   ''' <param name="description">
   ''' The description of the user account.
   ''' </param>
   '''
   ''' <param name="canChangePwd">
   ''' A value that indicates whether the user can change its password.
   ''' </param>
   '''
   ''' <param name="pwdExpires">
   ''' A value that indicates whether the password should expire.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <returns>
   ''' An <see cref="UserPrincipal"/> object that contains the user data.
   ''' </returns>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Public Shared Function Create(ByVal username As String,
                                 ByVal password As String,
                                 ByVal displayName As String,
                                 ByVal description As String,
                                 ByVal canChangePwd As Boolean,
                                 ByVal pwdExpires As Boolean) As UserPrincipal

       Using context As New PrincipalContext(ContextType.Machine)

           Dim user As New UserPrincipal(context)

           With user

               .Name = username

               .SetPassword(password)
               .PasswordNotRequired = String.IsNullOrEmpty(password)

               .DisplayName = displayName
               .Description = description

               .UserCannotChangePassword = canChangePwd
               .PasswordNeverExpires = pwdExpires

               .Enabled = True
               .Save()

           End With

           Return user

       End Using

   End Function

   ''' ----------------------------------------------------------------------------------------------------
   ''' <remarks>
   ''' Title : Add user-account.
   ''' Author: Elektro
   ''' Date  : 19-June-2015
   ''' </remarks>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <example>
   ''' UserAccountUtil.Add(username:="Elektro",
   '''                     password:="",
   '''                     displayName:="Elektro Account.",
   '''                     description:="This is a test user-account.",
   '''                     canChangePwd:=True,
   '''                     pwdExpires:=False,
   '''                     groupSid:=WellKnownSidType.BuiltinAdministratorsSid)
   ''' </example>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Adds a new user account in the current machine context.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="username">
   ''' The user name.
   ''' </param>
   '''
   ''' <param name="password">
   ''' The user password.
   ''' If this value is empty, account is set to don't require any password.
   ''' </param>
   '''
   ''' <param name="displayName">
   ''' The display name of the user account.
   ''' </param>
   '''
   ''' <param name="description">
   ''' The description of the user account.
   ''' </param>
   '''
   ''' <param name="canChangePwd">
   ''' A value that indicates whether the user can change its password.
   ''' </param>
   '''
   ''' <param name="pwdExpires">
   ''' A value that indicates whether the password should expire.
   ''' </param>
   '''
   ''' <param name="groupSid">
   ''' A <see cref="WellKnownSidType"/> security identifier (SID) that determines the account group where to add the user.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Public Shared Sub Add(ByVal username As String,
                         ByVal password As String,
                         ByVal displayName As String,
                         ByVal description As String,
                         ByVal canChangePwd As Boolean,
                         ByVal pwdExpires As Boolean,
                         Optional ByVal groupSid As WellKnownSidType = WellKnownSidType.BuiltinUsersSid)

       Using context As New PrincipalContext(ContextType.Machine)

           Using user As UserPrincipal = UserAccountUtil.Create(username, password, displayName, description, canChangePwd, pwdExpires)

               Using group As GroupPrincipal = GroupPrincipal.FindByIdentity(context, IdentityType.Sid, New SecurityIdentifier(groupSid, Nothing).Value)

                   group.Members.Add(user)
                   group.Save()

               End Using ' group

           End Using ' user

       End Using ' context

   End Sub

   ''' ----------------------------------------------------------------------------------------------------
   ''' <remarks>
   ''' Title : Add user-account.
   ''' Author: Elektro
   ''' Date  : 19-June-2015
   ''' </remarks>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <example>
   ''' UserAccountUtil.Add(user:=myUserPrincipal, groupSid:=WellKnownSidType.BuiltinAdministratorsSid)
   ''' </example>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Adds a new user account in the current machine context.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="user">
   ''' An <see cref="UserPrincipal"/> object that contains the user data.
   ''' </param>
   '''
   ''' <param name="groupSid">
   ''' A <see cref="WellKnownSidType"/> security identifier (SID) that determines the account group where to add the user.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Public Shared Sub Add(ByVal user As UserPrincipal,
                         Optional ByVal groupSid As WellKnownSidType = WellKnownSidType.BuiltinUsersSid)

       Using context As New PrincipalContext(ContextType.Machine)

           Using group As GroupPrincipal = GroupPrincipal.FindByIdentity(context, IdentityType.Sid, New SecurityIdentifier(groupSid, Nothing).Value)

               group.Members.Add(user)
               group.Save()

           End Using ' group

       End Using ' context

   End Sub

   ''' ----------------------------------------------------------------------------------------------------
   ''' <remarks>
   ''' Title : Delete user-account.
   ''' Author: Elektro
   ''' Date  : 19-June-2015
   ''' </remarks>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <example>
   ''' UserAccountUtil.Delete(username:="User name")
   ''' </example>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Deletes an user account in the current machine context.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="username">
   ''' The user name of the user-account to delete.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <exception cref="ArgumentException">
   ''' User not found.;username
   ''' </exception>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Public Shared Sub Delete(ByVal username As String)

       Using curUser As UserPrincipal = UserAccountUtil.FindUser(username)

           curUser.Delete()

       End Using

   End Sub

#End Region

End Class