Der Befehl

sc

aus der Windows Konsole, mit dem sich die Windows Dienste steuern lassen, hat einen entscheidenden Nachteil: Es sind keine Wildcards möglich, der Dienstname muss exakt so angegeben sein, wie er im System registriert ist.
Somit sind

sc stop

und

sc delete

schnell am Ende ihrer Möglichkeiten.

Angenommen ich habe einen oder mehrere Dienste mit einem bestimmten Namenspattern, die angesprochen und verarbeitet werden müssen. Das Namenspattern könnte beispielsweise sein: „[beliebige Zeichenkette]Manager“. Weitere Platzhalter wie „[beliebig]win[beliebig]svc[beliebig]“ sind ebenfalls möglich.

Im Gegensatz zu sc bietet

wmic service

entsprechende Möglichkeiten, mit Wildcards und komplexeren Anfragen umzugehen:

Abfragen:

REM Laufende Dienste mit "Manager" im Namen in der Konsole abfragen und einzelne Informationen filtern
wmic service where (name like "%%Manager%%" and state="running") get caption, name, state, status
REM Export aller Prozesse mit "Manager" im Namen als HTML exportieren
wmic service where (name like "%%Manager%%") get /format:hform >> C:/services.html
REM Namenspattern [beliebig]win[beliebig]svc[beliebig] suchen
wmic service where (name like "%%win%%svc%%") get caption, name, state

Das Bild zeigt den Windows Konsolenbefehl wmic service mit Paaternsuche

Starten/Stoppen/Löschen:

wmic service where (name like "%%win%%svc%%") call startservice
wmic service where (name like "%%Manager%%" and state="running") call stopservice
wmic service where (name like "%%Manager%%") call delete

via, via, via

Auch dieser Artikel reiht sich in die Liste der Software-Batch-AD-Deployment-Guides ein.
Im Falle von HipChat wird der Artikel recht kurz, denn hier passiert nichts ungewöhnliches.

Vorbereitung

Das Bild zeigt das HipChat Deployment Verzeichnis mit seinen üblichen DateienDer aktuellste HipChat-Installer (für Windows) ist als .exe immer unter dieser URL verfügbar.
Anschließend wird wieder ein übliches Deployment-Verzeichnis auf einem für die PCs verfügbaren Netzlaufwerk erstellt: Installer, Installer-Batch, allowedPCs.txt und deniedPCs.txt (mehr Informationen zum Clientfilter hier). Im Standardfall (so auch in diesem Deployment-Script) wird die deniedPCs.txt benutzt, um einzelne Clients von der Verteilung auszuschließen. Die Textdatei muss dann Computernamen enthalten, einen pro Zeile.
Der HipChat-Installer muss folgendermaßen umbenannt werden: „HipChat_[Version].exe“ und der Versionsstring muss in das Deployment-Script in Zeile 11.

Deployment-Script

19.09.2016: Version 4.27.1.1658 getestet und verteilt.

Hinweis: Wer nicht nur ein Update sondern eine komplette Reinstallation von Hipchat im Netzwerk ausrollen will, kann mein angepasstes Script – hier als Download – nutzen. Die benötigte VersionCompare.exe erhaltet ihr hier.

Hier das Script für ein normales Update:

@echo off && color 9f && setlocal
set wd=\\lea\Deployment\Software\Hipchat
set log=%wd%\hipchat.log
set tools=\\lea\Deployment\Sonstiges\tools
set hipEL=999
set instversion=0.0
set versionEL=9
set exepath=none
set retry=0
REM:: ######## EDIT THIS ####
set newversion=4.1658
REM:: #######################


REM:: Clientfilter: nur die Computer aus der allowedPCs.txt dürfen installieren
::for /f %%f in (%wd%\allowedPCs.txt) do if "%computername%"=="%%f" goto check
::goto end

REM:: Clientfilter: die Computer aus der deniedPCs.txt dürfen nicht installieren
for /f %%f in (%wd%\deniedPCs.txt) do if "%computername%"=="%%f" goto end

:check
if exist "C:\Program Files (x86)\Atlassian\HipChat4\HipChat.exe" set exepath="C:\Program Files (x86)\Atlassian\HipChat4\HipChat.exe"
::if exist "c:\Program Files (x86)\Skype\Phone\skype.exe" set exepath="c:\Program Files (x86)\Skype\Phone\skype.exe"
if %exepath%==none echo %date% %time:~0,8% - %computername% findet das .exe Verzeichnis nicht && goto taskkill
goto checkversion

:checkversion
for /f "tokens=1-3" %%i in ('%tools%\sigcheck %exepath%') do ( if "%%i %%j"=="File version:" set instversion=%%k )
%tools%\VersionCompare.exe %instversion% %newversion%
set versionEL=%errorlevel%
if "%versionEL%"=="-1" goto taskkill
if "%versionEL%"=="0" echo %date% %time:~0,8% - %computername% hat bereits %instversion% installiert >> %log% & goto end
if "%versionEL%"=="1" echo %date% %time:~0,8% - %computername% hat bereits %instversion% (neuer) installiert >> %log% & goto end
goto end

:taskkill
TASKKILL /f /im hipchat.exe
goto install

:install
echo %date% %time:~0,8% - %computername% installiert... >> %log%
::msiexec.exe /i %wd%\deploy\%newversion%\SkypeSetup.msi /qn /norestart FEATURE_IEPLUGIN=0 FEATURE_FFPLUGIN=0
start /w %wd%\HipChat_%newversion%.exe /verysilent /norestart /restartapplications /lang=german /lang=1031 /64 /64bit /x64
set hipEL=%errorlevel%
if %hipEL%==1618 goto retry REM:: msiexec process in use, installation already in progress (eg. windows updates running)
if %hipEL%==1602 goto retry REM:: user canceled installation (eg. taskkill)
if %hipEL%==1603 goto retry REM:: fatal error, some use it for "already installed" (eg. java)
if %hipEL%==1638 goto uninstall REM:: another product is already installed, denies an update
if %hipEL%==1625 goto uninstall REM:: skype installer sometimes threw this one, don't know why
set hipEL=%errorlevel%
echo %date% %time:~0,8% - %computername% hat Version %newversion% mit EL %hipEL% abgeschlossen >> %log%
md %wd%\done\%computername%
goto end

:retry
if %retry%==1 goto retryfailed
echo %date% %time:~0,8% - %computername% hatte den Fehler %hipEL%, retry in 500Sek... >> %log%
set retry=1
REM:: 5 Minuten warten
ping localhost -n 500 > nul
goto taskkill

:retryfailed
echo _!_ %date% %time:~0,8% - %computername% hat die Installation abgebrochen, RETRY FAILED! >> %log%
goto end

:uninstall
if %retry%==1 goto retryfailed
TASKKILL /f /im hipchat.exe
echo %date% %time:~0,8% - %computername% deinstalliert Version %instversion%... >> %log%
start /w "" "C:\Program Files (x86)\Atlassian\HipChat4\unins000.exe" /s /silent /qn
del /q /s "C:\Program Files (x86)\Atlassian"
echo %date% %time:~0,8% - %computername% - %instversion% deinstalliert, retry... >> %log%
set retry=1
goto taskkill

:end
endlocal
exit

Und das war’s auch schon. Bei einem Update muss nur die neue .exe-Datei heruntergeladen und die Version in Zeile 11 angepasst werden.
Das Script kommt als Computer-Startscript in das GPO und schon startet die Verteilung:
Das Bild zeigt die Logausgaben des HipChat-Deployments
Das Bild zeigt das Deployment der 1648er Version anhand des allnew-Update-Scripts (siehe Hinweis und Download oben). Dabei wird an jedem PC, unabhängig der installierten Version (deswegen wird überall „Version 0.0“ deinstalliert), HipChat komplett deinstalliert und neu installiert. Beim Umstieg auf 1648 würde ich das empfehlen, weitere Update werden ich auch wieder mit dem normalen Script erledigen.

Worum geht’s?

swords-and-souls-iconIch stelle kurz und knackig meinen in AutoIt 3 programmierten aktiven Bot für das Browserspiel Swords and Souls vor. Dieser ist hauptsächlich dafür da, Arena-Stages zu farmen. Außerdem nutzt er aktiv (und clever) alle Skills, leert regelmäßig die Bank, tauscht Kleeblätter ein, kauft EXP und speichert zwischendurch. Er könnte also ohne Probleme über Stunden durchlaufen und den Charakter damit verbessern.

Funktionen

Steuerung durch Shortcuts:

  • Shift+Alt+A – In der Arena kämpfen
  • Shift+Alt+M – Bank leeren und Kleeblätter eintauschen
  • Shift+Alt+O – Zurück zur Übersicht gehen, um andere Funktionen zu nutzen
  • Shift+Alt+H – Diese Hilfe noch einmal zeigen
  • Shift+Alt+X / ESC – Programm beenden

Farmingpausen mit:

  • Speichern
  • Gold von der Bank einsammeln
  • Kleeblätter eintauschen
  • Erfahrung für Gold kaufen (erst nach dem Besiegen des Endgegners möglich)

Cleveres Skillsystem:

  • Priorität 1: Heilen (Skill 5): nur wenn HP unter 40%
  • Priorität 2: Schildschlag (Skill 2): in Bosskämpfen immer benutzen, bei normalen Gegnern nur wenn dessen HP > 25%
  • Priorität 3: Schutzschild (Skill 4): immer wenn möglich
  • Priorität 4: Gift (Skill 3): in Bosskämpfen immer benutzen, bei normalen Gegnern nur wenn dessen HP > 50%
  • Priorität 5: Hack’n’Slay (Skill 6): in Bosskämpfen immer benutzen, bei normalen Gegnern nur wenn dessen HP > 50%
  • Priorität 6: Doppelangriff (Skill 1): in Bosskämpfen immer benutzen, bei normalen Gegnern nur wenn dessen HP > 25%

Screenshots

Die Einrichtung muss direkt nach dem Start geschehen und erfolgt durch einen Klick auf den obersten linkesten Pixel des Spielfensters:
swords-and-souls-bot-start-prepare-topleft-corner-pixel
Das Browserfenster muss so groß sein, dass das Spiel komplett angezeigt wird. Am Anfang werden in einem Hilfedialog alle Funktionen gelistet:
swords-and-souls-bot-start-help
In der Arena wird zuerst das Level für das Farming gewählt, anschließend noch ob das Pausenfeature genutzt werden soll und schon legt der Bot los:
swords-and-souls-bot-arena-start
swords-and-souls-bot-arena-fight

Video

Download und Code

Hier gibts den Bot als Download für 32/64bit Windows und, falls jemand den Bot weiterentwickeln oder anpassen möchte, den kompletten Code 1:1.

Download section
swords-and-souls-bot.exe (32bit)
swords-and-souls-bot_x64.exe (64bit)

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=swords-and-souls-bot.ico
#AutoIt3Wrapper_Compile_Both=y
#AutoIt3Wrapper_Res_Description=AutoIt Bot for the browsergame "Swords and Souls", developed by Hannes Schurig in 2016
#AutoIt3Wrapper_Res_Fileversion=1.0
#AutoIt3Wrapper_Res_LegalCopyright=Hannes Schurig
#AutoIt3Wrapper_Res_Language=1031
#AutoIt3Wrapper_Add_Constants=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

#include <Misc.au3>
#include <Array.au3>
#include <MsgBoxConstants.au3>

AutoItSetOption("SendKeyDelay", 40)
AutoItSetOption("SendKeyDownDelay", 40)
AutoItSetOption("MouseClickDelay", 40)
AutoItSetOption("WinTitleMatchMode", 2)
AutoItSetOption("MouseCoordMode", 1)

$noCoords = True
Local $ol[2]
$i = 0 ; fight counter
$survival = False
Local $levelcoords[2] = [0,0]
$clickCriticals = True
$pauseFarming = True
$pauseFarmingAfterXMatches = 2

HotKeySet("{Esc}", "exitnow") ; ESC
HotKeySet("+!x", "exitnow") ; Shift+Alt+X
HotKeySet("+!a", "arenaFight") ; Shift+Alt+A
HotKeySet("+!m", "museum") ; Shift+Alt+M
HotKeySet("+!o", "overview") ; Shift+Alt+O
HotKeySet("+!h", "help") ; Shift+Alt+H

Func exitnow()
	Exit
EndFunc

; prepare
WinActivate("Swords")
Sleep(300)
MsgBox($MB_TOPMOST + $MB_SETFOREGROUND + $MB_DEFBUTTON1 + $MB_ICONINFORMATION + $MB_OK,"Ecke oben links anklicken","Klicke in den obersten linkesten Pixel des Spiels.")
While $noCoords
		If _IsPressed("01") Then
		$ol = MouseGetPos()
		ConsoleWrite("####### Koords: " & $ol[0] & " " & $ol[1] & @CRLF)
		$noCoords = False
		EndIf
WEnd

If checkSingleCoordWithColor($ol[0]+578, $ol[1]+400, 0xB65D52) Then
		ConsoleWrite("####### Location: Map Overview" & @CRLF)
		MsgBox($MB_TOPMOST + $MB_SETFOREGROUND + $MB_DEFBUTTON1 + $MB_ICONINFORMATION + $MB_OK, "Deine Position", "Du befindest dich in der Übersichtskarte.")
EndIf

If checkSingleCoordWithColor($ol[0]+394, $ol[1]+460, 0x745818) Then
		ConsoleWrite("####### Location: Museum" & @CRLF)
		MsgBox($MB_TOPMOST + $MB_SETFOREGROUND + $MB_DEFBUTTON1 + $MB_ICONINFORMATION + $MB_OK, "Deine Position", "Du befindest dich im Museum.")
EndIf

If checkSingleCoordWithColor($ol[0]+66, $ol[1]+64, 0xC8B05E) Then
		ConsoleWrite("####### Location: Arena" & @CRLF)
		MsgBox($MB_TOPMOST + $MB_SETFOREGROUND + $MB_DEFBUTTON1 + $MB_ICONINFORMATION + $MB_OK, "Deine Position", "Du befindest dich in der Arena.")
EndIf

help()

Func help()
	MsgBox($MB_TOPMOST + $MB_SETFOREGROUND + $MB_DEFBUTTON1 + $MB_ICONINFORMATION + $MB_OK, "Hilfe", "Du kannst folgende Shortcuts nutzen:" & @CRLF & _
	"Shift+Alt+A - In der Arena kämpfen" & @CRLF & _
	"Shift+Alt+M - Bank leeren und Kleeblätter eintauschen" & @CRLF & _
	"Shift+Alt+O - Zurück zur Übersicht gehen, um andere Funktionen zu nutzen" & @CRLF & _
	"Shift+Alt+H - Diese Hilfe noch einmal zeigen" & @CRLF & _
	"Shift+Alt+X / ESC - Programm beenden" & @CRLF & _
	"Dies ist ein Maus/Tastatur-Bot. Der PC ist, während der Bot läuft, nicht direkt benutzbar.")
EndFunc

Func overview()
	; force-go to overview map
	While Not checkSingleCoordWithColor($ol[0]+578, $ol[1]+400, 0xB65D52)
		MouseClick("left", $ol[0]+25, $ol[1]+20,1)
		Sleep(800)
	WEnd
EndFunc

Func arenaFight()
	; check for overview map
	If checkSingleCoordWithColor($ol[0]+578, $ol[1]+400, 0xB65D52) Then
		; go to arena
		MouseClick("left",$ol[0]+235, $ol[1]+165,1)
	; check for arena
	ElseIf checkSingleCoordWithColor($ol[0]+66, $ol[1]+64, 0xC8B05E) Then
		; continue
	Else
		; force-go to overview map
		While Not checkSingleCoordWithColor($ol[0]+578, $ol[1]+400, 0xB65D52)
			MouseClick("left", $ol[0]+25, $ol[1]+20,1)
			Sleep(800)
		WEnd
		; go to arena
		MouseClick("left",$ol[0]+235, $ol[1]+165,1)
	EndIf

	; level input
	$level = InputBox("Welches Level?", "Bitte gib das Level ein, dass gefarmt werden soll." & @CRLF & _
	"Möglich Eingaben sind '1' - '30', 'survival' und 'final'", "", " M", 280, 150)

	If $level > 0 And $level <= 10 Then
		$levelcoords[0] = $ol[0] + 119 + (($level - 1)*62)
		$levelcoords[1] = $ol[1] + 292
	ElseIf $level > 10 And $level <= 20 Then
		$levelcoords[0] = $ol[0] + 97 + (($level - 11)*66)
		$levelcoords[1] = $ol[1] + 334
	ElseIf $level > 20 And $level <= 30 Then
		$levelcoords[0] = $ol[0] + 75 + (($level - 21)*71)
		$levelcoords[1] = $ol[1] + 392
	ElseIf $level = "final" Then
		$levelcoords[0] = $ol[0] + 489
		$levelcoords[1] = $ol[1] + 482
	ElseIf $level = "survival" Then
		$levelcoords[0] = $ol[0] + 339
		$levelcoords[1] = $ol[1] + 456
		$survival = True
	Else
		MsgBox($MB_TOPMOST + $MB_SETFOREGROUND + $MB_DEFBUTTON1 + $MB_ICONERROR + $MB_OK, "Falsche Eingabe", "Die Eingabe konnte nicht verwertet werden." & @CRLF & _
		"Der Bot setzt sich zurück, anschließend kannst Du erneut den Arena-Modus starten.")
		; force-go to overview map
		While Not checkSingleCoordWithColor($ol[0]+578, $ol[1]+400, 0xB65D52)
			MouseClick("left", $ol[0]+25, $ol[1]+20,1)
			Sleep(800)
		WEnd
		Sleep(1000)
		Return
	EndIf

	If $levelcoords[0] == 0 Then
		MsgBox($MB_TOPMOST + $MB_SETFOREGROUND + $MB_DEFBUTTON1 + $MB_ICONERROR + $MB_OK, "Unerwarteter Fehler", "Der Bot setzt sich zurück, anschließend kannst Du erneut den Arena-Modus starten.")
		; force-go to overview map
		While Not checkSingleCoordWithColor($ol[0]+578, $ol[1]+400, 0xB65D52)
			MouseClick("left", $ol[0]+25, $ol[1]+20,1)
			Sleep(800)
		WEnd
		Sleep(1000)
		Return
	EndIf

	; pause farming regulary after some matches - save, grab income, turn in cloverleafs frequently, get exp for gold?
	$save = MsgBox($MB_TOPMOST + $MB_SETFOREGROUND + $MB_DEFBUTTON1 + $MB_ICONQUESTION + $MB_YESNO, "Farming mit Pausen?", "Soll der Bot während des Farmens weitere hilfreiche Aufgaben übernehmen? Folgende Aufgaben würde der Bot alle " & $pauseFarmingAfterXMatches & " Matches ebenfalls übernehmen:" & @CRLF & _
	"- Speichern" & @CRLF & _
	"- Gold von der Bank einsammeln" & @CRLF & _
	"- Kleeblätter eintauschen" & @CRLF & _
	"- Erfahrung für Gold kaufen (erst nach dem Besiegen des Endgegners möglich)", "", " M")
	If $save = $IDYES Then
		$pauseFarming = True
	Else
		$pauseFarming = False
	EndIf

	; arena:
	while 1
		WinActivate("Swords")
		Sleep(1200)

; ------------- MANAGING MATCHES --------------------------------------------------

		; lost/survival done, retry
		If checkSingleCoordWithColor($ol[0] + 351, $ol[1] + 326, 0x5A3D1D) Then
			MouseClick("left",$ol[0] + 351, $ol[1] + 326, 1)
			$i += 1
		EndIf

		; survival start
		If $survival And checkSingleCoordWithColor($ol[0]+292, $ol[1]+175, 0x938D6F) Then
			; click survival
			MouseClick("left", $levelcoords[0], $levelcoords[1], 1)
			Sleep(500)
			; click "start"
			MouseClick("left", $levelcoords[0], $levelcoords[1], 1)
			Sleep(1500)
		EndIf

		; survival ended, "ok"
		If $survival And checkSingleCoordWithColor($ol[0] + 426, $ol[1] + 448, 0x5D3F1D) Then
			MouseClick("left", $ol[0] + 426, $ol[1] + 448, 1)
			Sleep(1000)
		EndIf

		; final ended, scarecrow talk
		If checkSingleCoordWithColor($ol[0] + 360, $ol[1] + 511, 0xE6DFC7) Then
			MouseClick("left", $ol[0] + 360, $ol[1] + 511, 1)
			Sleep(1000)
		EndIf

		; normal match start
		If checkSingleCoordWithColor($ol[0]+292, $ol[1]+175, 0x938D6F) Then
			MouseClick("left", $levelcoords[0], $levelcoords[1], 1)
		EndIf

		; normal match finished, continue
		If checkSingleCoordWithColor($ol[0]+378, $ol[1]+454, 0xFFFFFF) Then
			MouseClick("left", $ol[0]+378, $ol[1]+454, 1)
			$i += 1
		EndIf

; ------------- FIGHTING --------------------------------------------------

		; Skill 5 - Healing
		; check if available
		If checkSingleCoordWithColor($ol[0]+490, $ol[1]+560, 0xFFE7C1) Then
			; just use if u're below 50% health
			If checkSingleCoordWithColor($ol[0]+284, $ol[1]+453, 0x730520) Then
				; enough health
			Else
				Send("5")
			EndIf
		EndIf

		; Skill 2
		; check if available
		If checkSingleCoordWithColor($ol[0]+306, $ol[1]+565, 0xFFE7C1) Then
			; if in boss battle - use it anytime
			If checkCoordRangeWithColor($ol[0]+404, $ol[1]+451, $ol[0]+442, $ol[1]+469, 0xFFD23E) Then
				Send("2")
			Else
				; if not: only if enemy health 25% or more
				If checkSingleCoordWithColor($ol[0]+485, $ol[1]+453, 0x730520) Then
				Send("2")
				EndIf
			EndIf
		EndIf

		; Skill 4
		; if available
		If checkSingleCoordWithColor($ol[0]+430, $ol[1]+560, 0xFFE7C1) Then
			Send("4")
		EndIf

		; Skill 3 - Poison
		If checkSingleCoordWithColor($ol[0]+369, $ol[1]+552, 0xFFE7C1) Then
			; if in boss battle - use it anytime
			If checkCoordRangeWithColor($ol[0]+404, $ol[1]+451, $ol[0]+442, $ol[1]+469, 0xFFD23E) Then
				Send("3")
			Else
				; if not: only if enemy health 50% or more
				If checkSingleCoordWithColor($ol[0]+515, $ol[1]+453, 0x730520) Then
				Send("3")
				EndIf
			EndIf
		EndIf

		; Skill 6 - Slashing
		If checkSingleCoordWithColor($ol[0]+548, $ol[1]+561, 0xFFE7C1) Then
			; if in boss battle - use it anytime
			If checkCoordRangeWithColor($ol[0]+404, $ol[1]+451, $ol[0]+442, $ol[1]+469, 0xFFD23E) Then
				Send("6")
			Else
				; if not: only if enemy health 50% or more
				If checkSingleCoordWithColor($ol[0]+515, $ol[1]+453, 0x730520) Then
				Send("6")
				EndIf
			EndIf
		EndIf

		; Skill 1
		; if available
		If checkSingleCoordWithColor($ol[0]+249, $ol[1]+559, 0xFFE7C1) Then
			; if in boss battle - use it anytime
			If checkCoordRangeWithColor($ol[0]+404, $ol[1]+451, $ol[0]+442, $ol[1]+469, 0xFFD23E) Then
				Send("1")
			Else
				; if not: only if enemy health 25% or more
				If checkSingleCoordWithColor($ol[0]+485, $ol[1]+453, 0x730520) Then
				Send("1")
				EndIf
			EndIf
		EndIf

; ------------- REST --------------------------------------------------

		; save every 5th fight
		If $pauseFarming And $i >= $pauseFarmingAfterXMatches Then
			Sleep(1000)
			; force-go to overview map
			While Not checkSingleCoordWithColor($ol[0]+578, $ol[1]+400, 0xB65D52)
				MouseClick("left", $ol[0]+25, $ol[1]+20,1)
				Sleep(800)
			WEnd

			museum()
			expForGold()

			; go to arena
			MouseClick("left",$ol[0]+235, $ol[1]+165,1)
			$i = 0
			Sleep(1000)
		EndIf

	WEnd
EndFunc

Func museum()
	; force-go to overview map
	While Not checkSingleCoordWithColor($ol[0]+578, $ol[1]+400, 0xB65D52)
		MouseClick("left", $ol[0]+25, $ol[1]+20,1)
		Sleep(800)
	WEnd

	; go to museum
	MouseClick("left",$ol[0]+329, $ol[1]+459, 1)
	Sleep(1000)

	; get cash
	MouseClick("left",$ol[0]+479, $ol[1]+431, 1)
	Sleep(1000)

	; auto-invest clovers if u're in the room and have some
	While checkSingleCoordWithColor($ol[0]+651, $ol[1]+311, 0xE8E5C2)
		MouseClick("left",$ol[0]+651, $ol[1]+311,1)
		MouseMove($ol[0]+551, $ol[1]+211, 1)
		Sleep(2000)
	WEnd
	Sleep(1000)

	; get cash again
	MouseClick("left",$ol[0]+479, $ol[1]+431, 1)
	Sleep(1000)

	; force-go to overview map
	While Not checkSingleCoordWithColor($ol[0]+578, $ol[1]+400, 0xB65D52)
		MouseClick("left", $ol[0]+25, $ol[1]+20,1)
		Sleep(800)
	WEnd
	Sleep(1000)
EndFunc

Func expForGold()
	; force-go to overview map
	While Not checkSingleCoordWithColor($ol[0]+578, $ol[1]+400, 0xB65D52)
		MouseClick("left", $ol[0]+25, $ol[1]+20,1)
		Sleep(800)
	WEnd

	; go to shop
	MouseClick("left",$ol[0]+528, $ol[1]+213, 1)
	Sleep(1000)

	For $x = 1 To 30 Step +1
		MouseClick("left",$ol[0]+396, $ol[1]+548,1)
		Sleep(300)
	Next

	; force-go to overview map
	While Not checkSingleCoordWithColor($ol[0]+578, $ol[1]+400, 0xB65D52)
		MouseClick("left", $ol[0]+25, $ol[1]+20,1)
		Sleep(800)
	WEnd
	Sleep(1000)
EndFunc

Func training()

	; this feature is not ready yet
	Return

	; check for overview map
	If Not checkSingleCoordWithColor($ol[0]+578, $ol[1]+400, 0xB65D52) Then
		MsgBox($MB_TOPMOST + $MB_SETFOREGROUND + $MB_DEFBUTTON1 + $MB_ICONINFORMATION + $MB_OK, "Übersichtskarte", "Bitte gehe in die Übersichtskarte, um die Botfunktionen zu starten.")
		Return
	EndIf

	;training crit:
	While 1
		If checkSingleCoordWithColor(685, 382, 0xffffff) Then
			MouseClick("left")
			Sleep(700)
			MouseClick("left")
			$i +=1
			ContinueLoop
		EndIf
		If checkSingleCoordWithColor(789, 381, 0xffffff) Then
			MouseClick("left")
			Sleep(700)
			MouseClick("left")
			$i +=1
			ContinueLoop
		EndIf
		If $i>50 Then
			; quit crit training
			MouseClick("left", $ol[0]+25, $ol[1]+20, 1)
			Sleep(5000)
			; quit training room & go to map
			MouseClick("left", 298, 123, 1)
			Sleep(3000)
			; go to training room
			MouseClick("left", 673, 415, 1)
			Sleep(3000)
			$i = 0
			; start crit training
			MouseClick("left", 872, 147, 1)
			Sleep(3000)
		EndIf
	WEnd

	; training attack:
	While 1
		If Not checkSingleCoordWithColorV(326, 455, 0xCC9362, 3) Then
			Send("{LEFT}")
			ContinueLoop
		EndIf
		If Not checkSingleCoordWithColorV(560, 466, 0xAD794C, 4) Then
			Send("{RIGHT}")
			ContinueLoop
		EndIf
		If Not checkSingleCoordWithColorV(563, 541, 0x926743, 3) Then
			Send("{Down}")
			ContinueLoop
		EndIf
		If Not checkSingleCoordWithColorV(511, 373, 0xCF996B, 3) Then
			Send("{Up}")
			ContinueLoop
		EndIf
		If Not checkSingleCoordWithColorV(322, 424, 0xD4A57D, 3) Then
			Send("{LEFT}")
			ContinueLoop
		EndIf
	WEnd
EndFunc

Func checkSingleCoordWithColor($x, $y, $color)
		Return IsArray(PixelSearch($x-3, $y-3, $x+3, $y+3, $color, 3))
EndFunc

Func checkSingleCoordWithColorV($x, $y, $color, $variation)
		Return IsArray(PixelSearch($x-3, $y-3, $x+3, $y+3, $color, $variation))
EndFunc

Func checkCoordRangeWithColor($x1, $y1, $x2, $y2, $color)
		Return IsArray(PixelSearch($x1-3, $y1-3, $x2+3, $y2+3, $color, 3))
EndFunc

; keep-alive for shotcuts
while 1
	sleep(100000000)
WEnd

Hintergrundwissen

Skype Werbung nervt. Über die verschiedenen Skype Versionen wurde die Werbung unterschiedlich verbaut, sodass keine Lösung zum Entfernen der Werbung für immer funktioniert. So funktioniert es in der aktuellen (7.37) sowie sicher ein paar folgenden Versionen:

Windows hosts Datei umschreiben

Öffnet einen Texteditor eurer Wahl als Administrator (z.B. im Startmneü suchen -> Rechtsklick -> Als Administrator ausführen) und öffnet darin die Datei [C]:\Windows\System32\drivers\etc\hosts
Fügt dort folgende Zeilen hinzu:

0.0.0.0 rad.msn.com
0.0.0.0 live.rads.msn.com
0.0.0.0 ads1.msn.com
0.0.0.0 g.msn.com
0.0.0.0 a.ads2.msads.net
0.0.0.0 ac3.msn.com
0.0.0.0 apps.skype.com
0.0.0.0 static.2mdn.net
0.0.0.0 rad.msn.com
0.0.0.0 live.rads.msn.com
0.0.0.0 ads1.msn.com
0.0.0.0 static.2mdn.net
0.0.0.0 g.msn.com
0.0.0.0 a.ads2.msads.net
0.0.0.0 b.ads2.msads.net
0.0.0.0 ac3.msn.com
0.0.0.0 e4593.g.akamaiedge.net
0.0.0.0 apps.skype.com
0.0.0.0 48005751.r.msn.com
0.0.0.0 db3aqu.atdmt.com
0.0.0.0 cds26.ams9.msecn.net
0.0.0.0 sO.2mdn.net
0.0.0.0 aka-cdn-ns.adtech.de
0.0.0.0 secure.flashtalking.com
0.0.0.0 adnexus.net
0.0.0.0 adnxs.com
0.0.0.0 msntest.serving-sys.com
0.0.0.0 bs.serving-sys.com
0.0.0.0 flex.msn.com
0.0.0.0 ec.atdmt.com
0.0.0.0 cdn.atdmt.com
0.0.0.0 *.msads.net
0.0.0.0 *.msecn.net
0.0.0.0 *.rad.msn.com
0.0.0.0 a.ads2.msads.net
0.0.0.0 ac3.msn.com
0.0.0.0 ad.doubleclick.net
0.0.0.0 adnexus.net
0.0.0.0 adnxs.com
0.0.0.0 ads1.msn.com
0.0.0.0 ads2.msads.net

Danke an den Leser wolverine für diesen Tipp.

Die folgenden Absätze beziehen sich auf ältere Skype Versionen. Mit diesen Methode lässt sich die Werbung nicht mehr deaktivieren. Die hosts Datei ist aktuell eine funktionierende und relativ einfach umzusetzende Lösung.
Die Werbung wird bei Skype über zwei zusammenhängende Mechanismen eingebaut und abgesichert. Sie zu entfernen erfordert, beide Mechanismen auszuhebeln.

Skype Konfigurationsdateien ändern:
Im Ordner %AppData%\Skype (Win7: C:\Users\[user]\AppData\Roaming\Skype) gibt es für jeden Nutzer, der sich schon einmal an dem PC über Skype eingeloggt hat, einen Ordner, der so heißt wie der Skype Benutzer. In diesem Ordner gibt es eine config.xml, die ein paar interessante Zeilen enthält:

1
1
0
1

Die enthaltenen Werte müssen natürlich nur umgekehrt werden.

Es reicht jedoch nicht, diese Datei zu ändern…

Skype Kontrollserver deaktivieren:
Microsoft hat eine weitere Absicherung eingebaut, die bei jedem Start von Skype die Konfigurationsdateien auf unerlaubte Änderungen prüft und diese rückgängig macht. Dafür verbindet sich Skype bei jedem Start mit zwei Skype Servern und ändert die werberelevanten Stellen der config.xml. Diese Server müssen blockiert werden.
Das geht entweder über die hosts-Datei des Windows-Systems oder – etwas sauberer – über das definieren dieser Server als nicht-vertrauenswürdige bzw. „eingeschränkte Sites“ in den Windows Internetoptionen:
http://apps.skype.com
https://apps.skype.com
http://g.msn.com
https://g.msn.com

skype-werbung-entfernen-server-domains
Das geht coolerweise auch relativ einfach über die Registry.
Die Kombination der geblockten Server und geänderten Konfigurationsdatei sollte die Werbung aus Skype verbannen.

Tracing deaktivieren:
In einem Internetpost habe ich gelesen, dass die Datei RtmPal.dll aus dem Skype-Verzeichnis hauptsächlich für das Tracing, also die Beobachtung und Analyse des Nutzers, verantwortlich sein soll. Diese kann man ohne Bedenken „deaktivieren“, also löschen bzw. umbenennen.

Mein Lösungsscript vereint alle drei Anpassungen und deaktiviert somit Werbung und Tracing in Skype:

Lösung

Ich habe eine Lösung programmiert, die Skype Werbung und Tracing per Doppelklick deaktiviert. Die Lösung funktioniert nur bei Windows, sollte sowohl bei 32 als auch 64bit laufen und Windows- sowie Skype-versionsunabhängig sein.

Download section
Download (.zip, 2MB)

Der Download enthält 3 Dateien:
disableSkypeAds.batWird per Doppelklick aufgerufen, beendet Skype, importiert setSkypeAdDomainsAsRestricted.reg, führt disarmSkypeConfigs.ps1 aus, benennt RtmPal.dll um
setSkypeAdDomainsAsRestricted.reg – definiert die Domains apps.skype.com und g.msn.com als nicht vertrauenswürdig in den Windows Internetoptionen und blockiert diese damit (sauberer als über die hosts Datei)
disarmSkypeConfigs.ps1 – durchsucht das Skype Programmverzeichnis nach allen „config.xml“ Konfigurationsdateien (es gibt eine pro Skype Nutzer) und entfernt die für Werbung relevanten Stellen

Ein Doppelklick auf disableSkypeAds.bat müsste in etwa folgendes Bild zeigen:
skype-werbung-entfernen-script

Skype vorher und nachher, wenn alles funktioniert:
skype-werbung-entfernen-entfernt

Kurz notiert:
Dank PowerShell lassen sich bei Microsoft Exchange – in meinem Fall Exchange Online, also ein hosted Exchange – Änderungen gleich für mehrere oder sogar alle Nutzer ausführen. Vor allem bei Änderungen, die normalerweise nicht über die Adminoberfläche administrierbar sind, sondern über den Nutzer direkt eingestellt werden müssen, lohnt sich das enorm.

Verbindung zu Exchange Online in PowerShell herstellen

In PowerShell folgende Befehle nacheinander eingeben:

$UserCredential = Get-Credential

An dieser Stelle dann die Mail-Credentials eines Exchange Admins eingeben.

$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection

Speichert die Verbindung zu Exchange Online mit den Credentials in ein Objekt

Import-PSSession $Session

Lädt das Session Objekt

Anschließend könnt ihr auf dem Exchange Befehle ausführen, beispielsweise

Get-Mailbox

:
microsoft-exchange-online-changes-to-multiple-or-all-users-get-mailbox

In den folgenden Beispielen soll die Abwesenheitsmeldung bzw. Automatische Antwort eingestellt werden. Diese Einstellung eines Nutzers lässt sich mit folgenden Befehl abrufen:

Get-MailboxAutoReplyConfiguration -Identity hs@barketing.de

Änderungen für einzelne Benutzer

Aktivieren ohne zeitliche Einschränkung:

Set-MailboxAutoReplyConfiguration -Identity hs@barketing.de -AutoReplyState Enabled -ExternalAudience All -ExternalMessage "Guten Tag<br>Bla bla bla, Urlaub bla.<br>Mit freundlichen Grüßen"

Aktivieren mit Start- und Endzeitpunkt:

Set-MailboxAutoReplyConfiguration -Identity hs@barketing -AutoReplyState Scheduled -StartTime "11/11/2013 00:00" -EndTime "11/13/2013 18:00" -ExternalAudience All -InternalMessage "Guten Tag<br>Bla bla bla, Urlaub bla.<br>Mit freundlichen Grüßen"

(via)

microsoft-exchange-online-changes-to-multiple-or-all-users-set-mailboxautoreply

Änderungen für mehrere/alle Benutzer

Anhand des Pipe-Operators

|

können wieder Ausgaben eines Befehls an den nächsten Befehl zur Weiterverarbeitung übergeben werden.
Alle Benutzer:

Get-Mailbox | Set-MailboxAutoReplyConfiguration -AutoReplyState Enabled -ExternalAudience All -ExternalMessage "Guten Tag<br>Bla bla bla, Urlaub bla.<br>Mit freundlichen Grüßen"

Über

Get-Mailbox

werden alle Mailkonten geladen und an den

Set

-Befehl übergeben, der dadurch keinen

Identity

-Parameter mehr braucht.
Hinweis: Die Massenverarbeitung dauert natürlich entsprechend lange – für die 30 Nutzer bei uns hat der Befehl 4 Minuten gebraucht. Also nicht ungeduldig werden.

Mit Benutzervorauswahl:

Get-User | where {$_.Department -eq "Sales"} | Get-Mailbox | Set-MailboxAutoReplyConfiguration -AutoReplyState Enabled -ExternalAudience All -ExternalMessage [...]

Somit werden Nutzer erst durch den

where

-Befehl gefiltert, deren Postfächer geladen und weitergegeben. (via)

Typisches Problem – es funktioniert nicht

Wichtig:
Damit AutoReply-Regeln tatsächlich auch funktionieren, müssen in den Mailkonten auch wirklich E-Mails eingehen.
Bei Konten, die ihre E-Mails nur via SMTP weiterleiten und keine lokale Kopie der Mails in ihrem Postfach empfangen, funktioniert das Auto-Reply deswegen nicht.
Neben den AutoReply-Einstellungen muss demnach auch die Einstellung, dass beim Weiterleiten der Mails eine lokale Kopie behalten werden soll, gesetzt werden.
microsoft-exchange-online-changes-to-multiple-or-all-users-check-forwarding-settings

Einen Überblick über die Weiterleitungseinstellungen aller Nutzer bekommt ihr mit diesem Befehl:

Get-Mailbox | FL DeliverToMailboxAndForward, ForwardingAddress, ForwardingSmtpAddress

Mit diesem schnellen Überblick könnt ihr euch entweder selbst die Nutzer raussuchen, die eine Weiterleitung eingerichtet haben jedoch keine lokalen Kopien in ihr Postfach kriegen (und somit auch keine Automatische Antwort abschicken).
Oder ihr nutzt einfach folgenden Befehl. Dieser aktiviert diese Einstellung der lokalen Kopie für alle Benutzer, die eine Weiterleitung (intern sowie extern) eingerichtet haben:

Get-Mailbox | Where {$_.ForwardingSmtpAddress -ne $Null -OR $_.ForwardingAddress -ne $Null} | Set-Mailbox -DeliverToMailboxAndForward $True

(via)

Smartphones entwickeln sich ebenso rasant weiter wie die Speichermedien. Dennoch ist es ein weit verbreitetes Problem, dass in Low-Budget- und Mittelklasse-Smartphones zu wenig interner Speicherplatz verbaut ist. Bei vielen Unibody-Modellen ist es nicht einmal mehr möglich, Speicherkarten einzubauen. Der interne Speicher ist früher oder später also voll. Das nervt, denn es können dann weder Apps aktualisiert noch installiert werden. Außerdem verweigern manche Apps und Funktionen ihre Arbeit, beispielsweise streikt Google Music dann bei der Musikwiedergabe.

Es wird also Zeit, Speicher aufzuräumen, auszusortieren und dauerhaft zu entlasten bzw. zu optimieren. Ich trage hier ein paar Tipps zusammen, mit denen ich bisher oft aushelfen konnte.
Hinweis: Die Menüpunkte, Menüstrukturen oder Bezeichnungen unterscheiden sich von Hersteller zu Hersteller. So heißt der Punkt „Einstellungen -> Apps“ aus LG Nexus bei Samsung „Optionen -> Anwendungsmanager“. Ich glaube aber, dass sich die Menüpunkte trotz unterschiedlicher Benennung schnell finden lassen. Ich werde, wenn mir die Bezeichnungen bekannt sind, sie für mehrere Hersteller nennen.

Inhaltsverzeichnis:

Apps deinstallieren
Videos und Fotos löschen
Weitere große Datenmengen finden und löschen
Vorinstallierte Apps deaktivieren
Cache löschen
Apps auf die SD-Karte verschieben
Kamera-App auf die SD-Karte umleiten
Weitere Apps für SD-Karten-Nutzung konfigurieren
Weitere Tipps erwünscht

Apps deinstallieren

Das Bild zeigt den Android Dialog, mit dem eine App deinstalliert werden kannLogisch: Der erste Tipp besteht natürlich darin, nicht mehr benötigte Apps zu entfernen. Im App-Manager könnt ihr euch alle installierten Apps auflisten lassen. Öffnet die nicht mehr benötigten Apps und deinstalliert sie. Manchmal sind Spiele mehrere hundert Megabyte groß und damit – wenn nicht mehr gespielt – ein unnötiger Speicherkiller.

Videos und Fotos löschen

Das Bild zeigt eine Android Galerie mit Videos, die gelöscht werden könnenDurch Videos und Fotos können ebenfalls wertvolle Megabyte verbraucht werden. Diese haben zwar einen symbolischen und persönlichen Wert, aber mal ehrlich: Wie oft schaut man sich die Fotos und Videos vom letzten Jahr noch an? Eher selten. Diese Datenberge täglich mit dem Handy mit sich zu tragen, ist daher unnötig. Übertragt ältere Videos und Fotos am besten auf euren PC oder ein beliebiges Speichermedien mit genügend Speicher und löscht sie vom Handy – das kann unter Umständen schonmal 1-2GB Speicher freimachen.

Weitere große Datenmengen finden und löschen

Bestimmt verstecken sich an einigen Orten weitere größere Dateien. Die App MobileGo, die ich generell für verschiedene Aufgaben benutze und empfehle, hilft euch bei der Suche. Die App listet in der Funktion „Sparen Sie Speicherplatz“ gefundene Datenmengen und hilft bei der Beseitigung. Vor allem die Whatsapp Daten können größer sein, als man denkt. Vor allem wenn man viele Voice Nachrichten, Videos und Fotos verschickt oder bekommt.
Das Bild zeigt die App MobileGo mit der Funktion, die Speicherplatz-Fresser aufzeigt

Vorinstallierte Apps deaktivieren

Das Bild zeigt den App-Dialog einer App, die deaktiviert werden kannJe nach Hersteller sind auf eurem Smartphone vermutlich eine ganze Menge unnötiger Apps vorinstalliert. Diese können, wenn man sie nicht braucht, deinstalliert und deaktiviert werden. Ihr solltet jedoch vorsichtig sein, einige System-Apps und Google-Apps sollten unberührt bleiben.

Cache löschen

Apps speichern im Laufe ihrer Benutzung eine Menge Daten zwischen, die man gelegentlich löschen kann bzw. sollte – „Cache“ genannt. Sie können ebenfalls aus dem App-Manager heraus gelöscht werden. Die Größe der Cache-Daten verrät entweder die App-Liste des App-Managers, oder ihr verwendet erneut eine Funktion von MobileGo:
Das Bild zeigt die App MobileGo mit der Funktion, die systeminterne Speicherplatz-Fresser zeigt (Cache-Files und ähnliches)
Tipp: Ich empfehle, die Löschung der App-Caches nicht über MobileGo vorzunehmen, sondern über den Android-eigenen Dialog der jeweiligen App-Manager. MobileGo kann jedoch behilflich sein, besonders große Cache-Daten aufzuspüren. Am besten die Namen der Apps notieren und dann über den App-Manager aufräumen lassen:
Das Bild zeigt den Android-Dialog einer App, über den System-Daten und Caches gelöscht werden können
Achtung: Ihr solltet nur den Cache von Apps löschen. Wenn – wie beispielsweise beim originalen Android – zwischen Cache und Daten unterschieden wird (siehe Screenshot), solltet ihr die Daten nicht löschen. Dadurch gehen Einstellungen, Spielstände und andere wichtige Daten verloren, die ihr vermutlich behalten wollt.

Tipps für Smartphones mit SD-Karte

Apps auf die SD-Karte verschieben

Das Bild zeigt den App-Dialog, in dem manche Apps auf die SD-Karte verschoben werden könnenApps werden standardmäßig auf den internen Speicher installiert, obwohl dieser oftmals um ein Vielfaches kleiner ist als die SD-Karte. Manche Apps lassen sich mitsamt Daten auf die SD-Karte verschieben – dies müsst ihr im App-Manager für jede App einzeln überprüfen.

Kamera-App auf die SD-Karte umleiten

Das Bild zeigt die Kamera-App, in der das Speicherziel der Fotos und Videos auf die SD-Karte konfiguriert werden kannViel Speicherplatz wird durch Videos und Fotos der Kamera verbraucht. Durch die Einstellungen der Kamera können diese direkt auf die SD-Karte gespeichert werden, anstatt sie im internen Systemspeicher abzulegen. Die Einstellung sieht in etwa so aus:

Weitere Apps für SD-Karten-Nutzung konfigurieren

Das Bild zeigt die Google Music Einstellungen, in denen die SD-Karte als Speicherziel gewählt werden kannEinige weitere Apps, die größere Datenmengen produzieren können, bieten das Speichern auf der SD-Karte an. So beispielsweise auch Google Music – über die Einstellungen kann die SD-Karte als Speicherziel gewählt werden:
Vermutlich gibt es noch einige weitere Apps, die das anbieten – einfach immer die Einstellungen der Apps durchgucken.

Weitere Tipps erwünscht

Wenn ihr weitere Tipps und Tricks kennt, wie man den internen Speicher entlasten kann – immer her damit! Schreibt mir gerne Kommentare oder Mails, ich baue hier immer weiter an.

Fehler

Folgender Fehler kann bei WordPress auftreten, vermutlich nur bei bestimmten Hostern, nachdem es installiert oder hosterübergreifend umgezogen wurde:
Das Bild zeigt den WordPress Dialog, bei dem FTP Verbindungsinformationen benötigt werden sowie den Fehler, dass diese nicht korrekt seien - egal, welche Daten man eingibt. Das liegt an fehlerhaften Besitzrechten nach der WordPress Installation auf einigen Hostern wie beispielsweise auch All-Inkl und Hosteurope.
Der Fehler erscheint vermutlich bei der Installation oder Aktualisierung von Plugins oder Themes.

Erklärung

Das Bild zeigt den WordPress Dialog, bei dem FTP Verbindungsinformationen benötigt werden. Das Phänomen tritt auf, wenn ihr WordPress von Hand auf euren FTP hochgeladen und danach die Installation ausgeführt habt. Dadurch ist das WordPress Core mit den Besitzerrechten eures FTP Nutzers, mit dem ihr die WordPress Dateien hochgeladen habt, versehen. Alle Tätigkeiten aus dem WordPress System heraus, also beispielweise das Installieren von Plugins über die WordPress „Plugins“ Oberfläche, werden jedoch server-intern von einem anderen Nutzer ausgeführt. Dieser Nutzer heißt je nach System oftmals PHP-User, www-User, www-data oder ähnlich. Nun fehlen dem Nutzer aber die Zugriffsrechte auf die entsprechenden Ordner.

Lösungen

Es gibt mehrere mögliche Lösungen:

1)
Gebt bei der WordPress Nachfrage die FTP-Nutzerdaten ein, mit denen ihr WordPress hochgeladen habt. Den Nutzer könnt ihr, falls ihr es nicht mehr genau wisst, vielleicht mit dem WebFTP-Tool eures Hosters auslesen:
Das Bild zeigt die Oberfläche eines WebFTP Programms mit markierten Besitzerinformationen eines Ordners
Im besten Falle führt WordPress danach alle Plugin Aktionen ohne Klagen aus und ihr hört nie wieder von dem Problem. Aber dann wärt ihr wahrscheinlich auch gar nicht hier gelandet.

2)
Ändert die Besitzrechte von wp-content. Nutzt dafür vom Hoster zur Verfügung gestellte Möglichkeiten der Besitzrechteveränderung (Adminbackend -> Tools).
Zuerst wird der Ordner wp-content auf den PHP-User gestellt, die benötigte WordPress Funktion getestet (z.B. Plugin-Update, sollte jetzt gehen) und dann stellt ihr den Besitzer wieder zurück auf den FTP-User. Bei mir hat das die Probleme dauerhaft behoben und die Besitzrechte sind einheitlich weiterhin auf dem FTP-Nutzer.

3)
Mein zweiter Tipp ist eigentlich der langfristig sicherste: installiert WordPress nicht von Hand sondern über die 1-Click-Install-Methode eures Hosters. Praktisch jeder Webhoster bietet die Installation von bekannter Software auf seinem System an, WordPress ebenfalls. Dabei richtet der Hoster ein fertig installiertes und eingerichtetes System für euch ein, meistens mit nur wenigen Klicks. Dieses System hat definitiv keine Rechteprobleme, ist nun aber frisch installiert. Je nachdem, wie jung oder alt euer Blog ist, kostet es nun weniger oder mehr Aufwand, die Inhalte in das neu installierte System zu transferieren. Aber diese Lösung ist am sichersten und wird keine zukünftigen Probleme mehr machen, ich empfehle das also.
Export/Import: Der Export besteht im Grundlegenden aus 2 Typen: Daten (Beiträge, Kommentare usw), Plugins und Themes.
Daten: Benutzt entweder die WordPress eigene Export-Funktion unter „Werkzeuge -> Daten exportieren“ oder exportiert eure komplette WordPress Datenbank (SQL Export via phpMyAdmin). Diesen Export dann im neuen WordPress bzw. dessen Datenbank.
Plugins/Themes: Entweder ihr installiert im neuen WordPress die Komponenten von Hand (je nachdem wieviele es sind), oder ihr zieht euch direkt vom FTP die Ordner „plugins“ und „themes“ und überschreibt einfach diese Ordner in eurem neuen WordPress System.
Anschließend müsste der neue WordPress Blog die Plugins, Themes (die beide ggf. noch aktiviert werden müssen) und Daten enthalten.
Ich werde aber demnächst nochmal einen ausführlichen Beitrag über gute WordPress Backup Methoden schreiben und eine komplette Backup Lösung konzipieren.

4)
Tragt in eure .htaccess Datei in der Root eures WordPress Blogs (also direkt im obersten Ordner, beispielsweise „/blog/“) folgende Zeile ein:

AddHandler php5-cgi .php

Hintergrund: Link