markthom87
Goto Top

ASP.net Powershell Script ausführen

Hallo,

Ich habe ein Powershell Script geschrieben, was einen AD User erstellt, mit einem Random Passwort versieht und dann eine email an den beantrager zusendet (soll).
Möchte folgendes Scenario realisieren, der User geht auf eine Seite im Intranet und beantragt per "Button" Klick, die erstellung des AD Users. Es wird im hintergrund jede beantragung gelogt.

Nun hab ich aber das Problem, das mit dem Button klick einfach nichts passiert. Ich vermue, das dem IIS7 einfach die passenden Berechtigungen fehlen, für die ausführung.
Wäre für ein Tipp, der das Problem beseitigt, sehr dankbar.

Gruß

Content-ID: 231503

Url: https://administrator.de/contentid/231503

Ausgedruckt am: 25.11.2024 um 18:11 Uhr

colinardo
colinardo 03.03.2014, aktualisiert am 04.03.2014 um 16:03:00 Uhr
Goto Top
Hi,
Schau dazu hier mal rein:
Powershell Skripte über URL für andere Benutzer zugänglich machen

und für die Berechtigungen hier:
http://forums.asp.net/t/1552331.aspx?How+to+create+a+flipcart+like+pane ...

Der Account mit dem der IIS ausgeführt wird muss entweder selber das Recht haben Konten zu erstellen, oder besser du legst einen AppPool im IIS an, der mit einem User-Account läuft der die entsprechenden Rechte für dein Script besitzt:
http://forums.asp.net/t/1552331.aspx?How+to+create+a+flipcart+like+pane ...

back-to-topErstellen eines benutzerdefinierten Anwendungspools im IIS
Dazu gehst du in den IIS unter Anwendungspools > Anwendungspool hinzufügen und gibst Ihm einen Namen. Dann wählst du im Kontextmenü des Pools Erweiterte Einstellungen und im Dialog gibst du unter Identität einen Benutzeraccount inklusive Passwort an der deine benötigten Rechte besitzt. Dann legst du noch die Option Benutzerprofil laden auf True fest. Dann schließt du den Dialog mit OK. Jetzt musst du den Pool einer neuen Anwendung im IIS zuweisen. Dazu öffnest du das Kontextmenü deiner Website und wählst Anwendung hinzufügen. Dort vergibst du einen Alias-Namen unter dem das Verzeichnis später erreichbar ist und wählst den physikalischen Pfad zu deinen ASP.Net Seiten aus; und jetzt wichtig, musst du deinen gerade erstellen Anwendungspool auswählen.
Jetzt laufen die Seiten unter diesem Alias im Kontext des vorhin ausgewählten Useraccounts, und dein Script sollte problemlos durchlaufen.

Grüße Uwe
markthom87
markthom87 04.03.2014 um 15:24:41 Uhr
Goto Top
Vielen Dank Uwe, du hilfst mir sehr!

Mittlerweile glaube ich das es an meinem Script oder dem Aufruf liegt.
hab zwar den aufruf bei dir übernommen, aber es geht einfach nicht. face-sad

Hier mal meine VB datei
Imports System.Collections.ObjectModel
Imports System.Management.Automation
Imports System.Management.Automation.Runspaces
Imports System.Text
Imports System.IO
Imports System.Diagnostics
Partial Class _Default
Inherits System.Web.UI.Page

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
If Request.QueryString("action") <> "" Then
Dim action As String = Request.QueryString("action")
Select Case action
Case "deleteCache"
Dim newproc As Process
newproc = Process.Start("powershell.exe", "-NonInteractive -File ""C:\powershellASP\Scripts\testadmin.ps1""")
newproc.WaitForExit()
Response.Write("Script '" & action & "' wurde ausgeführt")
End Select
End If
End Sub
End Class

Und hier mein Script

  1. testadmin.ps1

  1. Import the Active Directory Module for Powershell
import-module ac*

## Build String AccountExpirationDate
[int]$_hour = (Get-Date).Hour + 1
[string]$_hour = "{0:D2}" -f $_hour
[string]$_exMin = "{0:D2}" -f (Get-Date).Minute
[string]$_exDay = "{0:D2}" -f (Get-Date).Day
[string]$_exMonth = "{0:D2}" -f (Get-Date).Month
[string]$_exYear = "{0:D2}" -f (Get-Date).Year
[string]$_exDate = $_exYear + "-" + $_exMonth + "-" + $_exDay + "T" + $_hour + ":" + $_exMin + ":00.0000000"

## Length of Random User&Password String
[int]$Length = 10
## Set the chars who used for Creating Strings
$set = "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789".ToCharArray()
## Create Random Admin User Login Name
[string]$_logonName = ""
for ($x = 0; $x -lt $Length; $x++) {
$_logonName += $set | Get-Random
}
## Create Random Admin User Password
[string]$_logonPW = ""
for ($x = 0; $x -lt $Length; $x++) {
$_logonPW += $set | Get-Random
}
## Convert _logonPW to a SecureString
$_secure = ConvertTo-SecureString -String $_logonPW -AsPlainText -Force
## Build PrincipalName for loginName
$_principalName = $_logonName + "@testdomaene.net"
## Create AD User
New-ADUser -Name $_logonName -UserPrincipalName $_principalName -DisplayName "AdminRequest" -AccountExpirationDate $_exDate -AccountPassword $_secure
Get-ADUser $_logonName | Move-ADObject -TargetPath 'OU=AdminRequest,DC=testdomaene,DC=net'
Add-ADGroupMember -Identity "Local admins" -Member $_logonName
Set-ADUser -Identity $_logonName -Enabled 1

<## Get Information about AccountExpirationDate
Get-ADUser -Properties AccountExpirationDate -Identity $_logonName
#>
## MailMessage Configuration and Body
$SMTPServer = "smtp.testdomaene.net"
$From = "AdminRequest@testdomaene.net"
$To = "tuser@testdomaene.net"
$Subject = "Your Admin Request"
$Body = @"

Login : $_logonName
Password : $_logonPW
Account Expiration : $_exDate
"@
Send-MailMessage -To $To -From $From -Subject $Subject -Body $Body -SmtpServer $SMTPServer -encoding ([System.Text.Encoding]::UTF8)
colinardo
colinardo 04.03.2014 aktualisiert um 15:34:26 Uhr
Goto Top
Kein Wunder wenn du den Code so einfach kopierst, denn in dem Code war eine Abfrage eines URL-Parameters eingebaut !!! Diese musst du natürlich rausnehmen...
und lege wie oben beschrieben den AppPool mit einem Admin-User an!
markthom87
markthom87 04.03.2014 um 15:39:49 Uhr
Goto Top
ich weiß das ich das powershell script mit

default.aspx?action=deleteCache aufrufe face-wink

Der AppPool ist mit einem Administrator angelegt. so wie du es oben, sehr gut beschrieben hast.
Kann ich die identity auch über die Domäne machen? Also testdomaene\Administrator?
colinardo
colinardo 04.03.2014 aktualisiert um 16:01:31 Uhr
Goto Top
Zitat von @markthom87:

ich weiß das ich das powershell script mit
sorry das war mir noch nicht klar
default.aspx?action=deleteCache aufrufe face-wink
auch über den benutzerdefinierten Alias-Pfad deiner Anwendung aufgerufen ?
Der AppPool ist mit einem Administrator angelegt. so wie du es oben, sehr gut beschrieben hast.
Kann ich die identity auch über die Domäne machen? Also testdomaene\Administrator?
Normalerweise ja. Setze in den Eigenschaften des App-Pools auch noch die Option Benutzerprofil laden das hatte ich vergessen.

Hier geht es testweise einwandfrei.

und bau in dein Script zu Debug-Zwecken mal eine Zeile ein die dir den aktuellen User im Powershell-Script in eine Datei schreibt:
echo $env:Username | out-file "C:\powershell_user.txt"
so kannst du überprüfen mit welchem Account das Script ausgeführt wird.
markthom87
markthom87 04.03.2014 aktualisiert um 16:38:49 Uhr
Goto Top
Hmm,

Der Fehler scheint irgendwo anders zu liegen. Meine App heißt "testasp" also ist der aufruf komplett wie folgt
http://localhost:1337/testasp/default.aspx?action=deleteCache

Die Seite gibt mir aus, dass das VB-Script gelaufen ist. Dadurch das dort steht Script 'deleteCache' wurde ausgeführt.
Aber ich hab das Gefühl der Fehler liegt wo anders.

WEIL! ändere ich im vb-script das ausführ Kommando also "deleteCache" auf "adminCreate" funktioniert das Script nicht mehr.
Bekomme auch keine Rückmeldung mehr. Gebe ich allerdings weiterhin, das "deleteCache" ein spult er immer das selbe runter.

Kann es also sein, das der Browser vielleicht noch chached? Obwohl ich den gelöscht habe?
colinardo
colinardo 04.03.2014 aktualisiert um 16:44:46 Uhr
Goto Top
Zitat von @markthom87:

Hmm,

Der Fehler scheint irgendwo anders zu liegen. Meine App heißt "testasp" also ist der aufruf komplett wie folgt
http://localhost:1337/testasp/default.aspx?action=deleteCache

Die Seite gibt mir aus, dass das VB-Script gelaufen ist. Dadurch das dort steht Script 'deleteCache' wurde
ausgeführt.
Aber ich hab das Gefühl der Fehler liegt wo anders.

WEIL! ändere ich im vb-script das ausführ Kommando also "deleteCache" auf "adminCreate" funktioniert
das Script nicht mehr.
Bekomme auch keine Rückmeldung mehr. Gebe ich allerdings weiterhin, das "deleteCache" ein spult er immer das selbe
runter.

Kann es also sein, das der Browser vielleicht noch chached? Obwohl ich den gelöscht habe?
das hat mit Caching nichts zu tun, die Abfrage kannst du komplett rauswerfen das war nur für den Anwendungsfall im anderen Thread relevant, die Namen habe nichts mit dem Browsercaching zu tun !!

Das hier reicht zur Ausführung:
Imports System.Diagnostics
Partial Class _Default
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
          Dim newproc As Process
          newproc = Process.Start("powershell.exe", "-NonInteractive -File ""C:\powershellASP\Scripts\testadmin.ps1""")  
          newproc.WaitForExit()
          Response.Write("Script '" & action & "' wurde ausgeführt")  
    End Sub
End Class
ohne jetzt wirklich zu prüfen ob es tatsächlich richtig durchgelaufen ist....
markthom87
markthom87 05.03.2014 um 08:32:16 Uhr
Goto Top
Ich bin vermutlich falsch Verstanden worden.

Aber die Script änderung ist eine sehr gute möglichkeit um zu Demonstrieren was ich meine.

Die Ausgabe "Script ... wurde ausgeführt" erscheint auch nach der änderung erst wenn ich die URL mit anhang
default.aspx?action=deleteCache
eintippe.

Wenn ich ohne "action" eingebe erscheint überhaupt keine Ausgabe. Daher vermute ich das hier irgendwas falsch gecached wird.
Hab es auch mit dem Restart vom IIS probiert usw. Hoffe konnte den Fehler verständlich rüber bringen.
markthom87
markthom87 12.03.2014 um 08:32:11 Uhr
Goto Top
DER IIS Server aktualisiert einfach nicht die Daten. Das merkt man schon daran, das wenn ich nen anderes Template hochladen, das er immer noch das alte anzeigt. Kann mir nicht vorstellen, dass das so richtig ist und da überhaupt richtig gecached wird.

Keine Idee, was daran vielleicht falsch läuft?
colinardo
colinardo 12.03.2014 um 08:42:14 Uhr
Goto Top
Für Entwicklungszwecke:
http://forums.iis.net/t/959070.aspx?How+do+you+disable+caching+in+IIS+

Das ist aber nicht Thema hier...mach dafür einen neuen Thread auf...Danke.

Grüße Uwe