Monday, 13 June 2011
Execute xp_cmdshell
So.
First, make sure that you have SA access on the server yourself. Then make sure the account that you want to use has access to the relevant databases on the SQL server. It can be a SQL user account or a Windows account: it doesn't matter. For the purpose of this snippet, I'm using a SQL account called 'user'. I'm going to go out on a limb, and guess that you already know how to create an SQL user account.
Then, grant the user execute rights on xp_cmdshell
GRANT EXEC ON xp_cmdshell TO [user];
Next, we need a proxy account which does have sysadmin access, and we'll use this account to run xp_cmdshell to run calls by users who are not members of the sysadmin role. This account must be a windows account. Give it access only to those drives and folders which it requires for the purposes of executing anticipated xp_cmdshell calls.
The proxy created is ##xp_cmdshell_proxy_account##, and in order to create it, you need both the Windows Login which has sysadmin access and its password.
EXEC sp_xp_cmdshell_proxy_account ‘domain\sysadminlogin’, ‘password’;
Check that this has created by querying the sys.credentials table
SELECT * FROM sys.credentials
Finally, verify that the SQL user has access to execute xp_cmdshell with the following code
EXECUTE AS LOGIN = 'user'
GO
EXEC xp_cmdshell 'whoami.exe'
REVERT
The result should be the Domain\Sysadmin account specified earlier.
Tuesday, 2 March 2010
Credentials, Proxies, and SSIS SQL Agent Jobs
Give one user access to see and execute one SSIS package as a SQL Agent Job, but none of the rest. Although the package exports data from one database on Server A to a new database on Server B, this does not count as a multi-server job in SQL terms. I've assumed that the package itself has been created and works as a SQL Agent Job under a sysadmin login, but I don't want to give this guy sysadmin access. He's a developer.
- Create the credential, based on an existing login, on Server B. If you use a Windows login, it will want the correct password for that login, so don't get clever and make one up (can you spot the mistake I made?).
- Make sure that the credential's login has the correct access on Server B
- Create the proxy, point it at the credential.
- Add principals to the Proxy i.e. the accounts that you want to have the rights of the proxy when executing the SQL Agent Job.
- Create the job, and make the user's Login the owner of the job.
- Give the user's Login the following rights in MSDB: db_ssisoperator and SQLAgentUserRole
- Test.
I found it very helpful to test this process out using my non-sysadmin Windows account: it meant I could test out the process while being able to see all error messages on my own machine.
Doubtless, there are better explanations of how to do this out there: and I am not sure what I would do if I needed to allow multiple users to execute the same package under such constraints. I am sure someone will let me know...
Wednesday, 20 January 2010
SSIS Package fails from SQL Agent
"Unable to start execution of step 1 (reason: line (1): Syntax error). The step failed".
A similar job gave the error:
"The command line parameters are invalid. The step failed." Again, no errors...
Looking inside the job, the command line seemed reasonable, giving, as it did "/SQL "Maintenance Plans\Weekly Check Integrity and Rebuild Indexes" /SERVER Servername /CHECKPOINTING OFF /SET "\Package\Weekly.Disable";false /REPORTING E"