2016-04-19 5 views
0

Ich habe ein ASP .NET WEB Forms-Projekt, und ich möchte Power-Shell-Skript zur Aktualisierung hosts Datei ausführen.Zugriff auf Hosts-Datei mit Powershell-Skript von C#

private void ExecutePowerShellScript(string scriptToExecute) 
{ 
    using (PowerShell powershelInstance = PowerShell.Create()) 
    { 
     var authManger = powershelInstance.Runspace.RunspaceConfiguration.AuthorizationManager; 
     powershelInstance.AddScript(scriptToExecute); 

     Collection<PSObject> results = powershelInstance.Invoke(); 

     if (powershelInstance.Streams.Error.Count > 0) 
     { 
      throw powershelInstance.Streams.Error[0].Exception; 
     } 

     foreach (var result in results) 
     { 

     } 
    } 

} 

Es ist das Skript:

$hostsPath = "$env:windir\System32\drivers\etc\hosts"; 
$hosts = get-content $hostsPath; 
[System.Collections.ArrayList]$arr = $hosts; 
$arr.Add(someValueHere); 
$arr | Out-File $hostsPath -enc ascii; 
# returns results; 
$arr; 
# end of the script"; 

ich dieses versucht: Invoke (Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted);

dann diese Paste Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted am Anfang des Skripts. Verwenden Sie diese Set-ExecutionPolicy Unrestricted - gleichen und gleichen Fehler. Zugriff auf den Pfad C: \ Windows \ System32 \ drivers \ etc \ hosts 'wird verweigert.

Das Skript funktioniert einwandfrei, wenn ich in der Konsolenanwendung lief.

Update: Ich führe Visual Studio als Administrator.

Update 2: OK, jetzt benutze ich die ImpersonatedUser, aber eine weitere Ausnahme auftreten. "Der angeforderte Registrierungszugriff ist nicht zulässig."

Stacktrace:

at System.ThrowHelper.ThrowSecurityException(ExceptionResource resource) 
at Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable) 
at System.Environment.GetEnvironmentVariable(String variable, EnvironmentVariableTarget target) 
at System.Management.Automation.ModuleIntrinsics.SetModulePath() 
at System.Management.Automation.ExecutionContext.InitializeCommon(AutomationEngine engine, PSHost hostInterface) 
at System.Management.Automation.AutomationEngine..ctor(PSHost hostInterface, RunspaceConfiguration runspaceConfiguration, InitialSessionState iss) 
at System.Management.Automation.Runspaces.LocalRunspace.DoOpenHelper() 
at System.Management.Automation.Runspaces.RunspaceBase.CoreOpen(Boolean syncCall) 
at System.Management.Automation.PowerShell.Worker.CreateRunspaceIfNeededAndDoWork(Runspace rsToUse, Boolean isSync) 
at System.Management.Automation.PowerShell.CoreInvokeHelper[TInput,TOutput](PSDataCollection`1 input, PSDataCollection`1 output, PSInvocationSettings settings) 

bei System.Management.Automation.PowerShell.CoreInvoke [TInput, TOutput] (PSDataCollection 1 input, PSDataCollection 1 Ausgang,

using (ImpersonatedUser impersonatedUser = new ImpersonatedUser(username, domain, password)) 
{ 
    using (PowerShell powershelInstance = PowerShell.Create()) 
    { 
     powershelInstance.AddScript(scriptToExecute); 

     //When the .Invoke() method is called, an exception with message "Requested registry access is not allowed." was thrown. 
     Collection<PSObject> results = powershelInstance.Invoke(); 

     if (powershelInstance.Streams.Error.Count > 0) 
     { 
      throw powershelInstance.Streams.Error[0].Exception; 
     } 
    } 
} 

Antwort

1

Ihre ASP.NET führt die PowerShell-Skript mit den Anmeldeinformationen des Arbeitsprozesses des Anwendungspools, bei dem es sich wahrscheinlich nicht um ein Administratorkonto handelt (sofern Sie es nicht geändert haben)

Das Ändern der hosts-Datei ist nur auf administrative Konten beschränkt, und Sie sollten sehr vorsichtig vorgehen, bevor Sie die Anmeldeinformationen des Arbeitsprozesses ändern.

Wenn Sie diese Änderung vornehmen, dann folgen Sie den Anweisungen hier: https://technet.microsoft.com/en-us/library/cc771170(v=ws.10).aspx

Auch hier kann diese Änderung Ihrer Anwendung anfälliger für Sicherheitslücken betreffen machen (da jeder in Ihrer Anwendung gefunden Exploits können mit Administratorrechten verwendet werden,).

Möglicherweise müssen Sie auch die Benutzerkontensteuerung (UAC) deaktivieren, wenn sie aktiviert ist.

Eine andere Möglichkeit ist die Verwendung von Identitätswechsel zur vorübergehenden Erhöhung Ihrer Privilegien. Sie können ein Beispiel einer Klasse sehen, die Ihnen dies (wrap everything up) hier ermöglicht: https://blogs.msdn.microsoft.com/joncole/2009/09/21/impersonation-code-in-c/

Hoffe, das hilft.

+0

Es sollte eine andere Problemumgehung haben ... – mihkov

+0

Sie können Identitätswechsel verwenden, aber die Risiken sind immer noch die gleichen. Ich habe es meiner Antwort hinzugefügt. –

+0

Ich habe den Beitrag aktualisiert, bitte überprüfen Sie es – mihkov

0

Ich habe eine andere Lösung gefunden, aber vielleicht ist es nicht die beste. Fügen Sie auf dem IIS-Server einfach einen neuen Anwendungspool hinzu. In den erweiterten Einstellungen ändern Sie die Identität zu benutzerdefinierten Konto und geben Sie Ihre Anmeldeinformationen in Windows ein. Verwenden Sie den neuen Anwendungspool für die Site.

+0

das war mein erster Vorschlag. wie ich sagte, es ist sehr sehr riskant aus Sicherheitssicht. –

+0

oh yeah, richtig.Ich war auf der Suche nach einer anderen Lösung und war vergessen Ich überlasse es als letzte Lösung. – mihkov