Lectura de acciones ocultas en C #
-
02-07-2019 - |
Pregunta
Entonces, tengo una pequeña aplicación C # que necesita verificar periódicamente el contenido de los directorios en varias máquinas en la red. Pensé que podía leer \ hostname \ C $ como una ruta de directorio, pero con la clase de directorio normal no parece haber una manera de autenticarse en los otros servidores para que pueda acceder al recurso compartido oculto. Estoy seguro de que hay una manera fácil de hacer esto que he pasado por alto, pero en este momento estoy un poco perplejo.
Solución
De http://bytes.com/forum/thread689145.html :
Todos los procesos se ejecutan en el contexto de un cuenta de usuario iniciada sesión. Si quieres abrir un archivo en otra computadora, su la aplicación debe estar ejecutándose en el contexto de un usuario que tiene permisos para abrir archivos en esa máquina. Usted puede hacer esto con suplantación.
La forma más fácil parece ser otorgar al usuario actual los derechos apropiados en las otras máquinas.
Otros consejos
Para autenticarse con un recurso compartido para el que el usuario que ejecuta el proceso no tiene permiso (que suele ser el caso de los recursos compartidos administrativos), intente ejecutar el comando net use:
net use SERVERNAME\IPC$ /user:USERNAME PASSWORD
Intente ejecutar esto en un proceso separado antes del código que realmente intenta acceder al recurso compartido, por ejemplo:
ProcessStartInfo psi = new ProcessStartInfo(
"net", "use " + SERVERNAME + @"\IPC$ /user:" + USERNAME + " " + PASSWORD);
Process p = new Process();
p.StartInfo = psi;
p.Start();
p.WaitForExit();
p.Close();
// The code to access the share follows...
Esto es útil si no es apropiado dar permiso al recurso compartido para la cuenta de usuario que ejecuta el proceso, p. para un modelo de seguridad en el que una aplicación de usuario final necesita acceder a datos en un recurso compartido al que el usuario no debería tener acceso directo.
¿Está buscando una manera de configurar el usuario actual en tiempo de ejecución?
Si no, siempre que el usuario que ejecuta el proceso tenga acceso a esas máquinas, esto funcionará para usted:
DirectoryInfo di = new DirectoryInfo(@"\\machineName\c$\temp");
FileInfo[] files = di.GetFiles();
foreach (FileInfo f in files)
{
Debug.WriteLine(f.Name);
}