2009-07-07 21 views
15

Chciałbym uruchomić xp_cmdshell (procedura TSQL) w celu zamontowania dysku sieciowego, a następnie dostępu do plików mdb z pilotami.Wykonaj polecenie xp_cmdshell jako konkretny użytkownik

Jestem administratorem na serwerze MS SQL i umożliwiłem wykonanie odpowiednio xp_cmdshell.

Jednakże nadal istnieje problem:

  • Kiedy zadzwonić xp_cmdshell, użytkownik wykonujący polecenia jest SQL SysAdmin, czyli rachunku prowadzonego procesu, który SQL Server.

  • życzę xp_cmdshell wykonuje jako konta z którego jestem podłączony do serwera SQL, czyli Administrator

Obie tezy są konta administratora w grupie, grupy SQLAdmin i są przyznawane do SERWERA KONTROLI. Obaj użytkownicy należą do tej samej domeny. Wszystko to działa na tej samej maszynie.

powodu tego konfliktu, nie można korzystać z dysku sieciowego, ponieważ jest ona zamontowana na SysAdmin a nie dla Administrator
Próbowałem użyć sp_ xp_ cmdshell_ proxy_ konto określić konto, z którego chcesz do uruchomienia xp_cmdshell, ale SysAdmin jest nadal używanym kontem.

Dlatego ten kod:
select user_name(), suser_name;
exec xp_cmdshell 'echo %username%';

wyświetlacze:
Administrator Administrator
SysAdmin

Czy ktoś wie, jak również personifikować xp_cmdshell polecenie? Czy jest coś do (ponownego) skonfigurowania?

Dzięki za pomoc.

+0

Konto proxy jest używany tylko wtedy, gdy użytkownicy nie sysadmin wykonać xp_cmdshell –

+0

Więc jak można wymusić określonego użytkownika sysadmin? – Antwan

+0

Aby wyjaśnić - użyłeś sp_xp_cmd_shell_proxy_account, aby ustawić konto, którego chcesz użyć, a następnie wykonałeś polecenie za pomocą polecenia xp_cmdshell, a używane konto jest nadal kontem usługi? Chcę tylko upewnić się, że rozumiem twoje kroki. – SqlRyan

Odpowiedz

1

Może mógłbyś wypróbować PsExec? Pobierz plik pod tym adresem URL i skopiuj go do folderu będącego częścią zmiennej środowiskowej% Path%.

http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx

exec xp_cmdshell 'psexec -u Administrator -p password net use ...' 
+1

To może być rozwiązanie, ale oznacza to wpisanie hasła w postaci zwykłego tekstu, co jest trudne. Poszukuję czystej metody TSQL ... – Antwan

+0

Cześć dziękuję za aktualizację ur, ale kiedy próbowałem to samo z poleceniem "exec xp_cmdshell" C: \ Adhoc \ PSTools \ psexec -u domena \ id -p hasło dir \\ sharelocation '"To działa wiecznie bez żadnego rezultatu, proszę sugeruję –

0

Można spróbować "net use" z nazwy użytkownika i hasła wewnątrz xp_cmdshell. To ustanawia poświadczenia dotyczące połączenia z UNC.

Jednak nie jestem pewien, jak długo to się utrzyma. Jeśli będzie trwała przez czas nieokreślony (np. Do momentu ponownego uruchomienia serwera), może być uruchomiona procedura składowana, która uruchomi się w trybie "net use" i zapewni jej późniejszą użyteczność.

Kolejne xp_cmdshell (aby uzyskać dostęp do plików MDB) nie wymagałoby uwierzytelnienia, ponieważ poświadczenia są już ustanowione w systemie operacyjnym.

+0

Prawie się wstydzę przyznać, ale to działa. To okropne z punktu widzenia bezpieczeństwa, ale zrobiłem to z desperacji. ALE - czy otwierasz pliki MDB bezpośrednio z dysku sieciowego? To by mnie zatrzymało noce. To, co robiłem, to wysyłanie dziennika w domu w środowisku bez domeny (to jest po prostu operacje kopiowania plików). – onupdatecascade

7

Ponieważ łączysz się z SQL jako login w grupie sysadmin, jako konto usługi działa xp_cmdshell.

Jeśli łączysz się jako login o niskich uprawnieniach, użyjesz zamiast tego nazwy xp_cmdshell_proxy_account. Więc najpierw spróbuj wykonać EXECUTE AS LOGIN='lowprivaccount', aby sprawdzić, czy to pomaga.

Oczywiście to, o co pytasz, nie jest oczekiwanym użyciem. Oczekiwanym zastosowaniem jest to, że konta o wysokim poziomie uprawnień mogą zezwalać na korzystanie z konta usługi przez xp_cmdshell, podczas gdy wszyscy inni muszą znosić konto proxy o niższych uprawnieniach.

+0

Więc ... czy naprawdę musisz uruchomić to przy użyciu kontekstu zabezpieczeń w roli serwera sysadmin? Idealnie powinieneś używać tylko roli sysadmin, kiedy musisz robić rzeczy sysadmin. –

3

I rzeczywiście musieli użyć tej metody w przeszłości podobnych rzeczy na udziałach sieciowych, spróbuj tego ...

- mapa dysku i sprawiają, że trwałe.

xp_cmdshell "Użyj t netto: \\ <serwer> \ <akcji> < hasło >/user: <nazwa>/persistent: yes"

- T-SQL kod korzystające z t napędu

- usunąć mapowanie dysków xp_cmdshell "stosowanie t netto:/delete"

rzeczywiście można skonfigurować zadanie, które wykonuje, gdy SQL usługa uruchamia się i mapuje ten dysk, aby zawsze mieć dostęp do udziału, dopóki działa sql. Wszystko, co musisz zrobić, to skonfigurować sproc, który mapuje dysk i zlecić wykonanie początkowego mapowania napędu i użyć sp_procoption (http://msdn.microsoft.com/en-us/library/ms181720.aspx)

+1

Jestem ciekawy, dlaczego chcesz zmapować dysk, zamiast bezpośrednio odwoływać się do ścieżki UNC? – Pondlife

+0

@Pondlife Czasami, gdy używasz alternatywnych poświadczeń do łączenia się z UNC (nie w twojej domenie), to pomaga. –

-2

Musisz utworzyć procedurę składowaną, do której umieścisz skrypt xp_cmdshell w tym.

Procedura przechowywana działa przy użyciu konta administratora, dlatego Twój xp_cmdshell będą skutecznie działać podczas wykonywania procedury przechowywanej

create procedure RunShellIndirectly 

as 

declare @tawandachinaka as varchar(50) 

set @tawandachinaka='DIR "c:\scrap measurement\"*.csv /B' 

EXEC xp_cmdshell @tawandachinaka 
+3

"Procedura składowana jest uruchamiana przy użyciu konta administratora": jest to [niepoprawne] (http://msdn.microsoft.com/en-us/library/ms188354 (v = sql.100) .aspx). – Pondlife

+0

Procedura składowana jest uruchamiana (w odniesieniu do systemu operacyjnego) przy użyciu aktualnie przypisanego konta usługi SQL, a SP można uruchomić tylko wtedy, gdy zezwala na to uprawnienie SQL (ustawione w zabezpieczeniach). –

-1

Po restarcie serwera musi wykonać polecenie rozwiązanie plase zapisać polecenie ...

Use Master GO 

EXEC master.dbo.sp_configure 'show advanced options', 1 RECONFIGURE WITH 
OVERRIDE GO 

EXEC master.dbo.sp_configure 'xp_cmdshell', 1 RECONFIGURE WITH OVERRIDE GO 

exec xp_cmdshell 'net use \ip\xxx pass /user:xxx /persistent:no' 

Use Master GO 

EXEC master.dbo.sp_configure 'show advanced options', 1 RECONFIGURE WITH 
OVERRIDE GO 

EXEC master.dbo.sp_configure 'xp_cmdshell', 0 RECONFIGURE WITH OVERRIDE 
Powiązane problemy