пакетный файл с sqlcmd требует правильных разрешений пользователя

У меня есть сценарий SQL, который работал в SQL Management Studio, но не мог быть выполнен в пакетном режиме.
Я обнаружил, что когда я использую файл import.csv по пути C, а не по нужному сетевому пути (D:), он работает

Пакетно

rem ---------- SQL Import/Merge Configbuilder File ----------
SET LOGFILE=MyLogFile.log
call :Logit >> %LOGFILE% 
exit /b 0
:Logit
sqlcmd -S localhost\SERVER1 -d Database-U sa -P Password -i "Import.sql"
CMD

импорт.sql

BULK
INSERT Configbuildertemp
FROM 'D:\Batchfiles\Configbuilderimport.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n'
)
GO

Вопрос:

Какой пользователь выполняет запрос sqlcmd в пакетном файле, когда я (подключенный к серверу с администратором) желаемой целью является выполнение через планировщик задач Windows?

Однако я мог бы вставить пакетно, чтобы скопировать файл в C: \ и снова удалить его после выполнения, но это было бы быком.


person veritaS    schedule 20.08.2015    source источник


Ответы (1)


В планировщике задач Windows вы можете определить для каждой задачи, какая учетная запись пользователя должна использоваться для запуска задачи. Если вы определяете учетную запись пользователя, которая имеет разрешения на чтение файлов из общей сетевой папки, содержащей Configbuilderimport.csv, для задачи, запускающей пакетный файл, вы можете использовать такой пакетный файл:

rem Remove a perhaps already existing network share mapped to drive D:.
%SystemRoot%\system32\net.exe use D: /delete /yes 2>nul

rem Temporarily map \\ServerName\NameOfShare to drive D: using credentials
rem of user account running this batch file as defined in task scheduler.
%SystemRoot%\system32\net.exe use D: \\ServerName\NameOfShare /persistent:no

rem ---------- SQL Import/Merge Configbuilder File ----------
SET LOGFILE=MyLogFile.log
call :Logit >> %LOGFILE%

rem Remove network share mapped to drive D:.
%SystemRoot%\system32\net.exe use D: /delete /yes 2>nul
exit /b 0

:Logit
sqlcmd.exe -S localhost\SERVER1 -d Database-U sa -P Password -i "Import.sql"
goto :EOF

Но если пакетный файл выполняется под учетной записью локального администратора, которая, конечно, не имеет прав доступа к файлам на \\ServerName\NameOfShare, то в пакетном файле необходимо указать пароль, домен и имя пользователя. Это более небезопасно по сравнению с задачей, определенной с помощью правильной учетной записи пользователя, поскольку любой, у кого есть доступ к пакетному файлу, может прочитать пароль. Пароль, введенный в планировщике задач для учетной записи пользователя, используемой для запуска пакетного файла, зашифрован Windows.

rem Remove a perhaps already existing network share mapped to drive D:.
%SystemRoot%\system32\net.exe use D: /delete /yes 2>nul

rem Temporarily map \\ServerName\NameOfShare to drive D: using credentials
rem specified here directly in the batch file in the line below.
%SystemRoot%\system32\net.exe use D: \\ServerName\NameOfShare password /user:domain\username /persistent:no

rem ---------- SQL Import/Merge Configbuilder File ----------
SET LOGFILE=MyLogFile.log
call :Logit >> %LOGFILE%

rem Remove network share mapped to drive D:.
%SystemRoot%\system32\net.exe use D: /delete /yes 2>nul
exit /b 0

:Logit
sqlcmd.exe -S localhost\SERVER1 -d Database-U sa -P Password -i "Import.sql"
goto :EOF
person Mofi    schedule 21.08.2015
comment
почему конечно у локального админа нет прав? потому что, когда я подключаюсь к серверу, я сопоставил сетевые диски, и даже расположение пакетного файла находится на диске Nass в сети. Спасибо, попробую, как приду с работы - person veritaS; 21.08.2015
comment
Я предположил, что под локальным администратором имелась в виду локальная системная учетная запись, которая по умолчанию в Windows имеет только права администратора на локальной машине. Но можно иметь локальную учетную запись UserX с правами локального администратора на ComputerA, которая также настроена на чтение, чтение/запись или даже полный доступ к общему ресурсу на Компьютер Б. Что касается разрешений на других машинах, имеет значение, является ли сеть самоуправляемой частной сетью с локальными пользователями или доменной сетью с пользователями домена. А постоянные сопоставления сетевых дисков связаны с пользователем и существуют только при входе в систему. - person Mofi; 21.08.2015