Benutzer mit den meisten Antworten
Get-PublicFolder funktioniert nicht als Dienst lokal auf dem Exchangeserver

Frage
-
Hallo,
ich habe ein Powershellscript, das automatisch PublicFolder anlegt, und Berechtigungen vergibt.
Leider funktioniert das Script nicht, wenn man es als Dienst laufen lässt. (User: Administrator)
Das Script findet dann z.B. den Befehl get-publicfolder nicht!
Ich habe schon versucht, das ganze als EWS PS Script zu machen, bekomme es aber nicht so richtig hin.
StartOptionen des Dienstes (RunAsSvc.exe):
Powershell.exe -version 2.0 -ExecutionPolicy Unrestricted -noexit -ImportSystemModules -command ". 'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1'; Connect-ExchangeServer -auto;. 'c:\Projektverwaltung\bin\ServiceTest.ps1'"
Das Script läuft auf dem "Desktop" ohne Probleme!
Hat jemand eine Idee, warum die Befehle für die PublicFolders hier nicht funktionieren?
MfG
Rainer
Antworten
-
...RunAsSvc funktioniert jedoch trotzdem.
Man muss nur als Pfad für die Powershell %systemroot%\sysnative\windowspowershell\v1.0\powershell.exe eintragen, ansonsten wird die Powershell in 32bit ausgeführt (Ersichtlich im Taskmanager)
syswow64 bzw. system32 funktioniert beides nicht!
- Als Antwort markiert rainersausj Freitag, 17. März 2017 09:41
Alle Antworten
-
Moin,
- Bist Du sicher, dass das Skript überhaupt startet? (Logdatei schreiben hilft)
- Wie führt man denn ein Skript als Dienst aus? Ein Skript hat ja die Eigenart, einen Anfang und ein Ende zu haben. Wenn da eine Endlosschleife zwischen ist, reicht zum Starten ein geplanter Task oder so etwas, und wenn da keine Endlosschleife dazwischen ist, läuft mein Dienst jetzt auch nicht unbedingt sehr lange ;-)
- Remoting zu Exchange nutzen ist definitiv vielversprechender als das Exchange-Snapin einbinden. Befreit Dich auch von der Notwendigkeit, Exchange Shell auf dem Server mit dem Skript zu installieren (und upzudaten)
Evgenij Smirnov
I work @ msg services ag, Berlin -> http://www.msg-services.de
I blog (in German) @ http://it-pro-berlin.de
my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
Exchange User Group, Berlin -> http://exusg.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com -
Hallo,
ja, das Script läuft definitiv.
Hier das Beispiel:
Der Befehl get-publicfolder wird nicht gefunden (Fehler wie in Remoteausführung in Exchangescript)
(Die Benennung "get-publicfolder" wurde nicht als Name eines Cmdlet, einer Funktion....)
Wenn das Script so ausgeführt wird, funktioniert alles.
#
# ServiceTest.ps1 (Exchange)
#
# Prüft, ob der Befehl get-publicfolder grundsätzlich funktionert!
#
#
# Fehlerbehandlung
#
$script:ErrorActionPreference = "silentlyContinue"
$RootPath = "c:\GFi_Projektverwaltung\"
$LogDatei = $RootPath + "log\StartPVScripts.log"
$LogPath = $RootPath + "log\"
$ScriptPath = $RootPath + "Scripts\"
$ScriptFertigPath = $RootPath + "ScriptsFertig\"
$ScriptFailPath = $RootPath + "ScriptsFail\"
#
# Fehlerbehandlung
#
trap {
$body = "Fehler aufgetreten in Line/Offset (StartPVScript - Exchange):" + $_.InvocationInfo.ScriptLineNumber + "/" + $_.InvocationInfo.OffsetInLine +"/" + $_.exception.message
sendmail $body
continue
}
#
# Unterfunktion sendmail:
#
function sendmail($body)
{
#$filename = "Pfad zum Dateianhang"
$SmtpClient = new-object system.net.mail.smtpClient
$MailMessage = New-Object system.net.mail.mailmessage
#$att = new-object Net.Mail.Attachment($filename)
$SmtpClient.Host = "exchange"
$mailmessage.from = "StartPVScript@gfi-group.net"
$mailmessage.To.add("gfi_syslog@gfi-group.net")
$mailmessage.Subject = “Error StartPVScriptsServiceVersion auf Server nv120021”
$MailMessage.IsBodyHtml = $true
$mailmessage.Body = $body
#$mailmessage.Attachments.Add($att)
$smtpclient.Send($mailmessage)
return
}
while (1) {
"Start Service" |Out-File c:\temp\startsrv.txt
$Trigger = gci "c:\GFi_Projektverwaltung\bin\Trigger.txt"|select-object FullName,Name
if ($Trigger ) {
Try { $Rueck = (get-publicfolder -identity "\GFiProjekte\C5porsche").Name}
Catch { # Bei Fehler melden...
$body = "Fehler aufgetreten in Line/Offset (StartPVScript - Exchange):" + $_.InvocationInfo.ScriptLineNumber + "/" + $_.InvocationInfo.OffsetInLine +"/" + $_.exception.message
sendmail $body
"Fehler!!!"|Out-File "c:\temp\error.txt"}
if ($Rueck -match "C5porsche" ) {
"Existiert"|Out-File "c:\temp\ok.txt"
} else {
$Rueck |Out-File "c:\temp\nok.txt"
}
} else {
"TriggerFile not found" |Out-File c:\temp\notrigger.txt
}
Start-Sleep -Seconds 120
}
echo "UndTschüsss" -
Moin,
auch wenn Du es vermutlich nicht hören willst:
- Wenn mit RunAsSvc dieses hier gemeint ist, so endet die vom Autor getestete Kompatibilität bei Server 2003. Da sehe ich zu Exchange ein gewisses Gap ;-)
- Da Du, wie erwartet, Endlosschleife mit Ausstiegstrigger verwendest, bringt Dir das ganze Dienstkonstrukt funktional gar nichts. Lasse Dein Skript mit einem Scheduled Task laufen und wende Dich dankbareren Dingen zu.
- In jedem Fall schau doch bitte, ob's mit Remoting funktioniert. Sofern die Mails versandt werden, ist die Netzwerkkonnektivität Deines Dienstes ja scheinbar gegeben.
Evgenij Smirnov
I work @ msg services ag, Berlin -> http://www.msg-services.de
I blog (in German) @ http://it-pro-berlin.de
my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
Exchange User Group, Berlin -> http://exusg.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com -
Ja, Server 2003 war ja auch als x64 eher ein Exot ;-)
Evgenij Smirnov
I work @ msg services ag, Berlin -> http://www.msg-services.de
I blog (in German) @ http://it-pro-berlin.de
my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
Exchange User Group, Berlin -> http://exusg.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com -
...RunAsSvc funktioniert jedoch trotzdem.
Man muss nur als Pfad für die Powershell %systemroot%\sysnative\windowspowershell\v1.0\powershell.exe eintragen, ansonsten wird die Powershell in 32bit ausgeführt (Ersichtlich im Taskmanager)
syswow64 bzw. system32 funktioniert beides nicht!
- Als Antwort markiert rainersausj Freitag, 17. März 2017 09:41
-
Hallo Rainer,
ich bin nicht wirklich der PS-Kenner eher ein Admin.
Kannst Du in Deinem Script den Aufruf:
Powershell.exe -version 2.0 -ExecutionPolicy Unrestricted -noexit -ImportSystemModules -command ". 'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1'; Connect-ExchangeServer -auto;. 'c:\Projektverwaltung\bin\ServiceTest.ps1'"
durch:
add-pssnapin *Exchange*
start-sleep 30ersetzen. Ja das ist die Holzhammermethode, könnte aber funktionieren.
Gruß Malte
-
Hallo Malte,
wie gesagt, mit explizitem Aufruf der 64bit Powershell funktioniert das ganze jetzt.
Habe jetzt nur noch ein kleines Problem mit der Replizierung von AD Inhalten über Standorte.
repadmin /syncall [DC] /d /e /a /force funktioniert nicht standortübergreifend.
Ich suche noch ein cmdlet, mit dem ich sofort das AD synchronisieren kann.
Als graphische Oberfläche verwenden wir von ManageEngine das Active Directory Replication Management tool.
(ist glaube ich das gleiche wie von TechCrafters sein).
Hier muss es noch anscheinend eine Powershell Version geben...