Danke! Kein Problem, mach ich doch gerne ![]()
Edit: Setze das Thema dann bitte noch auf erledigt, wenn alles klar ist.
Danke! Kein Problem, mach ich doch gerne ![]()
Edit: Setze das Thema dann bitte noch auf erledigt, wenn alles klar ist.
Alles anzeigenMan kann die Benutzerkontensteuerung für ausgewählte Anwendungen über die Windows Aufgabenplanung umgehen.
Das Prinzip ist unter anderem hier beschrieben:
https://www.petri.com/bypass-uac-using-desktop-shortcut
Eine Verknüpfung ist dafür nicht notwendig, der geplannte "Task" kann auch aus einer beliebigen Anwendung heraus gestartet werden.
Wenn man damit ein wenig spielt kann man sich vermutlich auch ein Konstrukt basteln, welches beliebige dynmaisch definierbare Anwendungen über einen einzigen "Geb mir Rechte Task" mit erhöhten Rechten startet.
Adminrechte werden allerdings einmalig für die Installation des "Tasks" benötigt, danach sollte das auch als einfacher Benutzer ausführbar sein.
Da war wohl jemand schneller
... hab wahrscheinlich zu viel geschrieben... UPS
Naja ich hab das jetzt mal für dich getestet und ja, es gibt eine Möglichkeit, zumindest hat das bei mir funktioniert.
Du hast Recht, wenn das Programm an sich Adminrechte fordert, ist ein Aufruf mit RunAs() nicht möglich.
Mit der Aufgabenplanung kann man das Problem aber überwinden, nämlich in dem du eine Aufgabe erstellst, die das Programm startet und du dann über ein AutoIt-Skript z.B. die Aufgabe startest und nicht das Programm an sich.
Wie das funktioniert:
1. Du startest die Aufgabenplanung ein einziges Mal mit Administratorrechten.
2. Du erstellst eine neue Aufgabe indem du auf Aufgabe erstellen klickst.
3. Als Name gibst du dann einen logischen Namen ein
4. Unten unter "Sicherheitskonto" muss im Feld "Beim Ausführen der Aufgaben folgendes Benuterkonto verwenden:" ein Adminkonto eingetragen sein, da die Aufgabe ja dann in seinem Namen ausgeführt wird, wodurch die UAC wegfällt.
5. Unten das Kästchen "Mit höchsten Privilegien ausführen" muss unbedingt angeklickt sein, weil das heißt ja soviel wie "als Admin ausführen"
6. Bei "Konfigurieren für" wäre es auch sinvoll, das auf dem PC ausgeführte Betriebssystem auszuwählen, falls möglich
7. Im zweiten Tab "Trigger" kannst du irgendeinen Trigger verwenden, solange er einmal ausgeführt wird, weil du deine Aufgabe sowieso manuell über das Skript startest und somit Keinen brauchst (Trigger dienen zum automatischen Ausführen der Aufgabe)
8. Im Reiter "Aktion" musst du nun eine neue Aktion erstellen, nämlich vom Typ "Programm starten" mit dem Pfad des Programms, dass dann mit Adminrechten gestartet werden soll.
9. Die Bedingungen und Einstellungen sind selbsterklärend sofern du diese überhaupt benötigst
10. Stelle die Aufgabe fertig
Die Aufgabe kannst du jetzt ganz einfach ohne RunAs und #RequireAdmin mit einer Zeile Code starten:
Run(@SystemDir & '\schtasks.exe /RUN /TN <<Name deiner Aufgabe>>')
<<Name deiner Aufgabe>> musst du durch den Namen in Punkt 3 ersetzen. Anführungszeichen werden nicht benötigt.
Bei Fragen gerne nochmal schreiben ![]()
LG NO1 ![]()
(Microsoft versucht anscheinend mit Windows 10 andauernd "auszuloten", wie viel Bevormunderei usw. die Kunden gerade noch akzeptieren).
Ja, also das versteh ich auch nicht... Die schaffen's mehr Mist zu bauen wie sie's zwischen Windows 95 und 7 auf die Reihe gebracht haben
. Zum Glück greifen unsere Politiker mal bzgl. dem Datenschutz ein (naja aber das gehört hier dann nicht mehr ins Forum meiner Ansicht nach).
Geht der elegante Weg über die Registry überhaupt noch, da sind doch einige Dateizuordnungen geschützt, damit sie nicht so einfach geändert werden können?
Ja ich denke schon, dass das noch möglich ist... wenn ich in die Registry geh' ist bei mir unter dem Dateiformats-Schlüssel unter shell/open/command der AdobeReader eingetragen, also funktioniert auch wie gewünscht... wenn du natürlich Fragen hinsichtlich der Registrierung an sich bzw. den Standardanwendungen oder andere Fragen hast, kannst du sie auch gerne stellen ![]()
LG NO1 ![]()
Also wenn du die Seite in der alten Systemsteuerung meinst, geht das über die GUID so:
Run(@SystemDir & "/control.exe /name {17cd9488-1228-4b2f-88ce-4298e93e0966} /page pageFileAssoc")
Direkt auf die Seite in der neuen Windows 10 Einstellungs-App kann man nicht zugreifen (das hat nicht mal Microsoft selber geschaft xD).
Die Seite davor kannst du aber auch so aufrufen:
FileCreateShortcut("ms-settings:defaultapps", @DesktopDir & "\standardapps.lnk")
ShellExecute(@DesktopDir & "\standardapps.lnk")
FileDelete(@DesktopDir & "\standardapps.lnk")
Der elegantere Weg, je nachdem was du vorhast, wäre jedoch über die Registry, wo die ganzen Einträge gespeichert sind.
LG NO1 ![]()
Hast du schon geschaut ob sich AIMP im silent-Mode installieren lässt?
Zuerst musst du mal eine Verbindung zum Server aufbauen und dann die Anfrage an diese Verbindung senden.
$hOpen = WinHttpOpen()
$hConnect = _WinHttpConnect($hOpen, "https://www.googleapis.com")
$sRequest = _WinHttpSimpleSSLRequest($hConnect, "POST", "/youtube/v3/commentThreads?part=snippet&key={YOUR_API_KEY}")
_WinHttpCloseHandle($sRequest)
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)
Natürlich musst du {YOUR_API_KEY} durch deinen API-Schlüssel ersetzen.
Typ ist schon richtig aber dein Pfad darf den vorgegangenen Foreslash nicht enthalten.
Soweit ich weiß funktioniert bei SimpleSSLRequest der Foreslash schon ![]()
Wow krass... danke für deine Bemühungen hier immer erstmal. Funktioniert einwandfrei, obwohl ich den Code noch nicht ganz verstehe. Danke alpines!
So, vielen Dank nochmal, funktioniert bislang alles wie gewollt.
Wenn es euch nicht stört, würde ich noch mit der Zeit hier Fragen stellen, damit ich mich weiterbilden kann
.
Zum Beispiel: Wie benutze ich Arrays mit DLL-Calls? Geht das?
"Programme, die einem Spieler bei jeglicher Art von Computerspiel (auch Einzelspieler) einen Vorteil verschaffen ("Bots") Tools, um Nachrichten unerwünscht oft zu versenden (Spamming-Tools) Programme, die anderen, auch Freunden, einen Schreck einjagen sollen oder sich sonst über andere Nutzer lustig machen ("Spaßviren") Automatisierung von Webseiten oder Tools, die das in ihren AGBs verbieten".
Bots sind hier nicht erwünscht/gestattet. Natürlich ist das nicht auf alle bezogen, aber zumindest auf die, die einen nicht gerechtfertigten Vorteil gegenüber Anderen verschaffen. Deswegen wirst du hier auch nur von einem Teil der Mitglieder Zustimmung/Hilfe bekommen. (Ist nicht böse gemeint ;))
Erzeug einfach z.B. ein static string path = null; in der Klassedefinition und greife von deinen Methoden darauf zu.
Sofern du DllOpen verwendest, bleiben die Zuordnungen gültig. Das bedeutet bspw., wenn du in der setPath Methode path = "bla" setzt,dann wird in deiner getPath Methode auch "bla" zurückgegeben werden.
Danke, das hat mir sehr weitergeholfen. Werde morgen mal schaun, aber der Part funktioniert! ![]()
Meinst du die .NET Version oder? Aber ja, kann ich machen.
Mal ne andere Frage: Ich muss ein mit der DLL erstelltes Objekt! speichern. Normal würde man ja jetzt die Variablen noch vor dem Konstruktor erstellen, damit alle Methoden der Klasse auf diese zugreifen können. Das geht ja nicht, da es sich um DLL-Aufrufe handelt und die Methoden statisch sind. Ein anderer Weg wäre vielleicht, das erstellte Objekt an den AutoIt DLLCall zurückzugeben und dieses dann später per DLLCall wieder an die DLL zu übergeben. Ich weiß jetzt aber nicht wie ich das machen soll, da die return types bei DLLCall ja nur die standardmäßigen Typen beinhalten und keine Objekte von benutzerdefinierten C# Klassen (was ja auch Schwachsinn wäre). Kann man das irgendwie über die Handles regeln?
Super alpines! Mit 4.5.2 funktioniert's wunderbar. Es gibt nämlich nur 4.6.1 und 4.6 ist die letzte funktionierende Version.
So. Da ich grad in der Shoutbox nach dem Thread gefragt hab, wollte ich natürlich auch mit mit dem DLL Export arbeiten.
Problem: Der Compiler spuckt diese Fehlermeldung aus:
Erst: Fehler beim Erstellen des Builds... und dann
Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
Fehler Unerwarteter Fehler bei der DllExportAppDomainIsolatedTask-Aufgabe.
System.ArgumentException: Der angeforderte Wert "Version46" konnte nicht gefunden werden.
Server stack trace:
bei System.Enum.EnumResult.SetFailure(ParseFailureKind failure, String failureMessageID, Object failureMessageFormatArgument)
bei System.Enum.TryParseEnum(Type enumType, String value, Boolean ignoreCase, EnumResult& parseResult)
bei System.Enum.Parse(Type enumType, String value, Boolean ignoreCase)
bei RGiesecke.DllExport.MSBuild.ExportTaskImplementation`1.<>c__DisplayClass8.<GetGetToolPathInternal>b__7(Version version, String toolName) in c:\Users\rober_000\Documents\Code\unmanaged-exports\RGiesecke.DllExport.MSBuild\ExportTaskImplementation.cs:Zeile 568.
bei RGiesecke.DllExport.MSBuild.ExportTaskImplementation`1.TryToGetToolDirForFxVersion(String toolFileName, Func`3 getToolPath, String& toolDirectory) in c:\Users\rober_000\Documents\Code\unmanaged-exports\RGiesecke.DllExport.MSBuild\ExportTaskImplementation.cs:Zeile 725.
bei RGiesecke.DllExport.MSBuild.ExportTaskImplementation`1.ValidateToolPath(String toolFileName, String currentValue, Func`3 getToolPath, String& foundPath) in c:\Users\rober_000\Documents\Code\unmanaged-exports\RGiesecke.DllExport.MSBuild\ExportTaskImplementation.cs:Zeile 698.
bei RGiesecke.DllExport.MSBuild.ExportTaskImplementation`1.ValidateFrameworkPath() in c:\Users\rober_000\Documents\Code\unmanaged-exports\RGiesecke.DllExport.MSBuild\ExportTaskImplementation.cs:Zeile 680.
bei RGiesecke.DllExport.MSBuild.ExportTaskImplementation`1.ValidateInputValues() in c:\Users\rober_000\Documents\Code\unmanaged-exports\RGiesecke.DllExport.MSBuild\ExportTaskImplementation.cs:Zeile 396.
bei RGiesecke.DllExport.MSBuild.ExportTaskImplementation`1.Execute() in c:\Users\rober_000\Documents\Code\unmanaged-exports\RGiesecke.DllExport.MSBuild\ExportTaskImplementation.cs:Zeile 264.
bei RGiesecke.DllExport.MSBuild.DllExportAppDomainIsolatedTask.Execute() in c:\Users\rober_000\Documents\Code\unmanaged-exports\RGiesecke.DllExport.MSBuild\DllExportAppDomainIsolatedTask.cs:Zeile 241.
bei System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Object[]& outArgs)
bei System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg)
Exception rethrown at [0]:
bei System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
bei System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
bei Microsoft.Build.Framework.ITask.Execute()
bei Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
bei Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext() Chromium4AutoIt
Ich habe die aktuelle Version vom UExport, auf x86 hab ich auch gestellt...
Wollte mal wieder die normale Addition testen...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using RGiesecke.DllExport;
namespace Test
{
public class Class1
{
[DllExport("add", CallingConvention = CallingConvention.StdCall)]
static int add(int eins, int zwei)
{
return eins + zwei;
}
}
}
Alles anzeigen
Natürlich gehts auch mit F5 / F7 aber die Funktion wird nicht mal exportiert! (sagt auch der DLLExportViewer)
Wisst ihr, an was das liegt?
Oh okay... ja das wird dann echt etwas schwierig, weil einfache HTTP-Anfragen (InetRead, WinHTTP) immer den statischen Quelltext zurückgeben, heißt der "Standard-Quellcode", der für jede Plattform gleich ist... die Seite wäre natürlich echt hilfreich... vll kann man die Daten auch über TCP abfangen, aber dann muss man mit dem Server kommunizieren und ich denke es geht bestimmt leichter... Naja wir wissen echt wenig über die Seite... muss man sich anmelden? Wird der Inhalt aktualisiert? Usw....
Meinst du mit "dynamisch nachgeladen" onload, das heißt, dass einmalig die Seite für dich dynamisch erstellt wird oder wird diese ständig aktualisiert?
Ich weiß jetzt nicht wirklich, welche Infos du genau bekommen willst, aber vielleicht handelt dieser Thread ja von deinem Problem...
--> Parse HTML String width DOM
Da bekommst du halt den reinen HTML Code und die Styles (extra)... oder magst du für jedes Element auch gleich den Style mitgeliefert bekommen?
Hey Leute... jetzt bevor wieder diese Diskutiererei anfängt, mal paar Sachen und ich mag Keinen von euch angreifen:
Ein Dreizeiller ist schwer?
Nein, für UNS natürlich nicht. Was firewalldevil gemeint hat, war eher, dass er sich gefragt hat, warum es so schwer ist, hier ne Lösung zu bekommen.
Wenn Du das nicht willst sags gleich und frag nach fertigen Code.
Ja da hast einmal DU Recht und einmal firewalldevil... er hat nämlich ganz oben gleich nach dem Code gefragt und wir sind hier in der Kategorie "Programmieranfragen" und nicht "Hilfe & Unterstützung ![]()
Fileopendialog gibt einen String zurück, der Dateinamen enthält.
Wenn du 1 Datei auswählst schaut der Pfad in etwa so aus:
Laufwerk:\Ordner\...\Ordner\Datei
Wenn mehrere Dateien gewählt werden wird
Laufwerk:\Ordner\...\Ordner|Datei 1|Datei 2|...
zurückgegeben.
Mit FileSelectFolder kannst du einen Ordner auswählen.
In jedem Fall benötigt DirGetSize als Parameter einen Ordner und keine Datei!
Du kannst also entweder FileSelectFolder verwenden oder du musst aus deinem FileOpenDialog den Ordnerpfad extrahieren.
EDIT: Da war wohl jemand schneller ![]()
Wie hast du es denn versucht? Ohne Skript wirds etwas schwer?
Hast du es mit _IEGetObjById schon probiert?