Sto costruendo un programma console .net C# per distribuire file su un server di condivisione file Windows (cartella condivisa). Il percorso è :: \\192.168.0.76\htdocs\public
Copia file su rete tramite condivisione file, autenticazione utente
a correre sto ottenendo l'errore:
[09:35:29]: [Step 1/3] Unhandled Exception: System.UnauthorizedAccessException: Access to the path '\\192.168.0.76\htdocs\public' is denied.
[09:35:29]: [Step 1/3] at DeployFileShare.Program.CopyDir(String source, String dest, String[] exclude, Boolean overwrite)
[09:35:29]: [Step 1/3] at DeployFileShare.Program.Deploy(String num, String source)
[09:35:29]: [Step 1/3] at DeployFileShare.Program.Main(String[] args)
[09:35:29]: [Step 1/3] Process exited with code -532459699
Penso di aver bisogno di autenticare me stesso. Ho incontrato questo:
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
WindowsIdentity idnt = new WindowsIdentity(username, password);
WindowsImpersonationContext context = idnt.Impersonate();
Ho anche provato:
AppDomain.CreateDomain("192.168.0.76").SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
WindowsIdentity idnt = new WindowsIdentity("user", "pass");
WindowsImpersonationContext context = idnt.Impersonate();
Non sono sicuro di come usarlo. Quando eseguo l'applicazione ottengo:
C:\Users\Administrator>DeployFileShare 1 R:\BuildOutput\_PublishedWebsites\Web 2
1
Deploy Started Web, version 21
-- Deploy Prepared
-- Deploying to 1
Unhandled Exception: System.Security.SecurityException: There are currently no l
ogon servers available to service the logon request.
at System.Security.Principal.WindowsIdentity.KerbS4ULogon(String upn)
at System.Security.Principal.WindowsIdentity..ctor(String sUserPrincipalName,
String type)
at DeployFileShare.Program.Authenticate(String server)
at DeployFileShare.Program.Deploy(String num, String source)
at DeployFileShare.Program.Main(String[] args)
The Zone of the assembly that failed was:
MyComputer
Ecco il codice di base:
static void Main()
{
Copy();
}
static void Copy()
{
AppDomain.CreateDomain(GetServerInfo(server, "server")).SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
WindowsIdentity idnt = new WindowsIdentity(GetServerInfo(server, "user"), GetServerInfo(server, "pass"));
WindowsImpersonationContext context = idnt.Impersonate();
string source = "C:\\someDir";
string dest = "\\192.168.0.76\shareFolder"
string[] sourceFiles = Directory.GetFiles(source, "*", SearchOption.AllDirectories);
foreach (string file in sourceFiles)
{
string local = file.Replace(source, "");
if (exclude.Contains(local))
continue;
if (!Directory.Exists(Path.GetDirectoryName(dest + "\\" + local)))
Directory.CreateDirectory(Path.GetDirectoryName(dest + "\\" + local));
File.Copy(file, dest + "\\" + local, overwrite);
Console.WriteLine("-- -- [copied] {0} -> {1}", file, dest + "\\" + local);
}
}
Il sistema di copia codice per le opere di loop, ho provato sul mio sistema locale.
Se qualcuno sa come dovrei usare WindowsIdentity e WindowsIdentity per farlo funzionare, per favore mi illumini. Mi sono guardato intorno e la documentazione di Windows non aiuta molto.
In pratica, come è possibile copiare in una directory remota condivisa effettuando l'accesso al sistema?
Si consiglia di prendere in considerazione l'utilizzo di Powershell per questo. È quindi possibile utilizzare net * \\ 192.168.9.76 \/USER: SomeUser prima di eseguire la copia (per il quale vorrei utilizzare Robocopy.exe ...) –
@JamesJohnson Sto usando l'IP perché stiamo lavorando con VMware e avere la macchina che esegue questo programma in un dominio diverso sotto VMware. Quindi il nome del computer non funziona. –
Credo ci sia un modo più universale: http://stackoverflow.com/questions/295538/how-to-provide-user-name-and-password-when-connecting-to-a-network-share/39540451# 39540451 –