Berechtigungen treten nur bei vollständig qualifiziertem Exe-Pfad auf. Warum nicht immer?

9

Wenn ich versuche, das Dienstprogramm SQL Server 2012 BCP.exe auszuführen, um den Inhalt einer Tabelle unter Verwendung eines vollqualifizierten Pfads zur EXE-Datei in eine Datei zu speichern,

  

D:\SQL20120\Tools\Binn\bcp.exe DBNAME.DBO.TABLENAME OUT %FileServerProject%\IMPLEMENTATION\DAT\Pre_Run_BaseTables\CDB_ACCT_CURR.DAT -S%SqlServer% -T -N >> %LogFolder%\Log.log

... Ich bekomme einen ACCESS DENIED Fehler.

Wenn ich jedoch den vollständig qualifizierten Pfad zur exe entferne und ausführe,

  

bcp.exe DBNAME.DBO.TABLENAME OUT %FileServerProject%\IMPLEMENTATION\DAT\Pre_Run_BaseTables\CDB_ACCT_CURR.DAT -S%SqlServer% -T -N >> %LogFolder%\Log.log

Es funktioniert gut.

Wenn der Pfad nicht qualifiziert ist, verstehe ich, dass Windows jeden in der Umgebungsvariablen PATH angegebenen Ordner durchsuchen wird, um nach der angegebenen exe zu suchen und die erste gefundene auszuführen. Also habe ich den folgenden Befehl von der Konsole ausgeführt, um meine PATH Variable zu sehen.

%Vor%

Bereinigen Sie die verschiedenen nicht verwandten Pfade von der Ausgabe, ich sah den folgenden SQL-bezogenen Ordner in dieser Reihenfolge zurückgegeben:

%Vor%

Der letzte Tools\Binn Pfad war der einzige Ordner, der das Dienstprogramm bcp.exe enthielt.

Meine Frage ist das:

Da dieselbe EXE ausgeführt wurde, egal ob ich den Pfad explizit qualifiziert oder Windows durch Suchen der Pfadvariable verlassen hatte, warum habe ich einen ACCESS DENIED-Fehler erhalten, wenn ich den vollqualifizierten Pfad verwendet habe und nicht, wenn ich mich nicht qualifiziert habe der Weg?

Beachten Sie, dass ich in beiden Fällen unter einer ID ausgeführt wurde, die Rechte für den Ordner TOOLS\BINN gelesen und ausgeführt hat. In dem Fall, in dem ich den vollqualifizierten Pfad verwendet habe, wenn ich das Konto zur lokalen Gruppe hinzugefügt habe, würde es funktionieren, aber das war keine praktikable Lösung. Außerdem hatte die ID LogOn As Batch Rechte für den Server.

Aktualisierung:

Ich habe jetzt keinen Zweifel, dass, wenn ich den unqualifizierten bcp.exe Pfad benutze, ich tatsächlich die einzige Kopie von bcp.exe auf dem Server laufen lasse. Für den Anfang habe ich Alles durchsuchen verwendet, um alle Laufwerke auf dem Server ausgiebig zu durchsuchen. Ich habe drei Vorkommnisse gefunden. Ich habe dann die 2 umbenannt, die ich nicht versehentlich referenzieren wollte.

Ich habe dann den Job mit dem unqualifizierten bcp.exe -Pfad wiederholt, und auf der Registerkarte Prozess des Task-Managers habe ich bcp.exe unter dem Dienstkonto gefunden. Ich habe dann mit der rechten Maustaste auf den Dateinamen geklickt und das Kontextmenü "Dateispeicherort öffnen" ausgewählt. Dadurch bin ich an den einzigen Speicherort der bcp.exe -Datei gelangt, die nicht umbenannt wurde - die Datei, auf die ich absichtlich zugreifen wollte der vollständig qualifizierte Name.

D:\SQL20120\Tools\Binn

Da bcp.exe nicht qualifiziert war, wurde es erfolgreich ausgeführt.

Update 2 Bis jetzt haben 42 Leute sich das angesehen. Ich wäre neugierig, wenn Leute dieses Sprichwort sehen würden "das ist unmöglich, dass die Fakten in diesem Fall nicht genau so sein müssen, wie ich es gesagt habe."

Fast schon da: Ich habe die Batchdatei auf das Minimum reduziert, um das Problem zu reproduzieren. Du wirst bemerken, dass ich unsere wahren Pfadnamen geändert habe, aber ich habe den Kern davon behalten.

Hier ist der "Vorher" -Code:

%Vor%

Hier ist das "Nachher", das funktioniert hat

%Vor%

Beachten Sie, dass der Unterschied darin besteht, dass der funktionierende BCP-Pfad in Anführungszeichen gesetzt wurde. Ich hätte gedacht, dass dies nur wichtig gewesen wäre, wenn der Pfad eingebettete Leerzeichen enthalten hätte. Ich bin verwirrt, warum es in diesem Fall wichtig war.

Ein sekundäres neues Problem ist, warum der Befehl WHERE nicht funktionierte, wenn er unter MYSERVICDEACCOUNT durch einen Scheduler ausgeführt wurde. Der Befehl funktioniert, wenn ich mich manuell unter MYLANID anmelde, zu c:\users\mylanid navigiere und es probiere.

Wenn jemand erklären kann, warum die Zitate wichtig sind, bekommen sie 100 Punkte und meine Dankbarkeit.

Update 4:

Ich habe die Datei AgentParm.txt auf einem Server gefunden, auf dem derselbe Code funktioniert. Es war im Ordner Programme:

%Vor%

Auf dem Server, den wir besprochen haben, wo ich das Problem habe, wenn die Stapeldatei nicht aufgelistet ist, sehe ich Folgendes im Ordner Programme (x86). Alle anderen Linien waren gleich, also habe ich sie ausgeschlossen. Ich habe nichts von oscomponent.cmdprefix.force.quotes.full erwähnt.

%Vor%

Benötige ich die 64-Bit-Version von CA Scheduler, um 64-Bit-Exes auszuführen? Wenn ja, habe ich ein Problem mit 32-Bit-Exes (wie SQL Server dtexec.exe) mit dem 64-Bit-CW-Scheduler?

    
ChadD 19.09.2015, 02:02
quelle

3 Antworten

0

Könnte es etwas damit zu tun haben, worauf Sie hingewiesen haben? wahrscheinlich unbeabsichtigt

32Bit D:\SQL2012 (86)0\Tools\Binn\ 64Bit D:\SQL20120\Tools\Binn\ Ihr harter Pfad ruft 64 Bit auf und Ihre %PATH% Variable findet zuerst die 32Bit Version.

    
Martin Barker 27.09.2015 23:15
quelle
0

Ich kenne den CA Workload Automation-Scheduler nicht, aber verwenden Sie bei der Jobspezifikation die JIL-Syntax?

Eine Suche nach Supportdokumenten scheint darauf hinzuweisen, dass ein Doppelpunkt (":") ein Sonderzeichen in JIL ist und durch Anführungszeichen oder umgekehrte Schrägstriche geschützt werden muss.

%Vor%     
codersl 28.09.2015 00:38
quelle
0

Dies ist nicht genau die gleiche Situation, die Sie beschrieben haben, aber es scheint, als könnte es die gleiche Ursache und die gleiche Ursache haben. Die Dokumentation hier (S.45) beschreibt eine Situation, in der Jobs mit qualifizierten Pfaden, die an den CA Workload Automation Agent in Windows übergeben werden, unerwartet reagieren, wenn sie zitiert werden. Dies gilt für Pfade mit und ohne Leerzeichen.

Auf den Punkt gebracht - scheinbar wurde das behoben, indem der Datei agentparm.txt ein Parameter oscomponent.cmdprefix.force.quotes.full hinzugefügt wurde, den Sie abhängig vom gewünschten Verhalten auf true oder false setzen können.

Die beschriebene Situation entspricht nicht genau Ihrer. Daher bin ich mir nicht 100% sicher, dass dies eine Lösung ist, aber es wäre es wert, diese Einstellung zu testen ob es das Verhalten, das Sie beobachten, umgeschaltet hat.

    
J Richard Snape 28.09.2015 10:19
quelle