प्रश्नों को ट्रेस करना
निष्पादित प्रश्नों को ट्रेस करते समय, नीचे क्वेरी पाया जाता है जो एक-एक करके ड्राइव पर फ़ोल्डर्स को सूचीबद्ध करता है।
declare @Path nvarchar(255)
declare @Name nvarchar(255)
select @Path = N'D:\'
select @Name = null;
create table #filetmpfin (Name nvarchar(255) NOT NULL, IsFile bit NULL, FullName nvarchar(300) not NULL)
declare @FullName nvarchar(300)
if exists (select 1 from sys.all_objects where name = 'dm_os_enumerate_filesystem' and type = 'IF' and is_ms_shipped = 1)
begin
if (@Name is null)
begin
insert #filetmpfin select file_or_directory_name, 1 - is_directory, full_filesystem_path from sys.dm_os_enumerate_filesystem(@Path, '*') where [level] = 0
end
if (NOT @Name is null)
begin
if(@Path is null)
select @FullName = @Name
else
select @FullName = @Path + convert(nvarchar(1), serverproperty('PathSeparator')) + @Name
create table #filetmp3 ( Exist bit NOT NULL, IsDir bit NOT NULL, DirExist bit NULL )
insert #filetmp3 select file_exists, file_is_a_directory, parent_directory_exists from sys.dm_os_file_exists(@FullName)
insert #filetmpfin select @Name, 1-IsDir, @FullName from #filetmp3 where Exist = 1 or IsDir = 1
drop table #filetmp3
end
end
else
begin
if(@Name is null)
begin
if (right(@Path, 1) = '\')
select @Path= substring(@Path, 1, len(@Path) - charindex('\', reverse(@Path)))
create table #filetmp (Name nvarchar(255) NOT NULL, depth int NOT NULL, IsFile bit NULL )
insert #filetmp EXECUTE master.dbo.xp_dirtree @Path, 1, 1
insert #filetmpfin select Name, IsFile, @Path + '\' + Name from #filetmp f
drop table #filetmp
end
if(NOT @Name is null)
begin
if(@Path is null)
select @FullName = @Name
else
select @FullName = @Path + '\' + @Name
if (right(@FullName, 1) = '\')
select @Path= substring(@Path, 1, len(@FullName) - charindex('\', reverse(@FullName)))
create table #filetmp2 ( Exist bit NOT NULL, IsDir bit NOT NULL, DirExist bit NULL )
insert #filetmp2 EXECUTE master.dbo.xp_fileexist @FullName
insert #filetmpfin select @Name, 1-IsDir, @FullName from #filetmp2 where Exist = 1 or IsDir = 1
drop table #filetmp2
end
end
SELECT
Name AS [Name],
IsFile AS [IsFile],
FullName AS [FullName]
FROM
#filetmpfin
ORDER BY
[IsFile] ASC,[Name] ASC
drop table #filetmpfin
मुख्य फ़ंक्शन का उपयोग किया जाता है sys.dm_os_enumerate_filesystem
, जो प्रत्येक फ़ोल्डर के लिए खोला जाता है, यह एक स्तर गहरा हो जाता है, दूसरे स्तर का एक उदाहरण:
select @Path = N'D:\Data\'
नियमित लॉगिन के लिए
नियमित लॉगिन के लिए यह उतना आसान है जितना कि इस टीवीएफ पर चुनिंदा अनुमतियों को नकारना उपयोगकर्ता को फ़ोल्डर्स को सूचीबद्ध करने में सक्षम नहीं बनाता है।
DENY SELECT ON master.sys.dm_os_enumerate_filesystem TO [Domain\LoginName]
बैकअप का चयन करने का प्रयास करते समय, उपयोगकर्ता को यह संदेश देखना चाहिए:
उपयोगकर्ता तब केवल ड्राइव अक्षर देख पाएंगे।
निहित उपयोगकर्ताओं के लिए
निहित उपयोगकर्ता के लिए, सीधे टीवीएफ पर चयन से इनकार करना काम नहीं करता है
निहित उपयोगकर्ता सफलतापूर्वक अगले क्वेरी उदाहरण को चला सकता है
declare @Path nvarchar(255)
declare @Name nvarchar(255)
select @Path = N'D:\'
select file_or_directory_name, 1 - is_directory, full_filesystem_path from sys.dm_os_enumerate_filesystem(@Path, '*') where [level] = 0
और .... यह काम नहीं करता है:
use [PartialDb]
GO
DENY SELECT ON [sys].[dm_os_enumerate_filesystem] TO [PartialUser];
GO
Msg 4629, लेवल 16, स्टेट 10, लाइन 34 अनुमतियाँ सर्वर पर सूचीबद्ध कैटलॉग दृश्य या सिस्टम संग्रहीत कार्यविधियाँ या विस्तारित संग्रहीत कार्यविधियाँ केवल तभी प्रदान की जा सकती हैं जब वर्तमान डेटाबेस मास्टर हो।
नीचे बयान काम करते हैं लेकिन वे उपयोगकर्ता को प्रतिबंधित नहीं करते हैं, भले ही यह dbrole
भूमिका का हिस्सा न हो
DENY VIEW DATABASE STATE TO [PartialUser];
DENY VIEW DEFINITION ON SCHEMA :: information_schema TO [PartialUser];
DENY VIEW DEFINITION ON SCHEMA :: sys TO [PartialUser];
DENY SELECT ON SCHEMA :: information_schema TO [PartialUser];
DENY SELECT ON SCHEMA :: sys TO [PartialUser];
क्या काम करता है? सिद्धांत रूप में
चूंकि निहित उपयोगकर्ता dmv से कनेक्ट करने और चयन करने के लिए अतिथि खाते / सार्वजनिक भूमिका का उपयोग करता है, (सार्वजनिक भूमिका डिफ़ॉल्ट रूप से कुछ वस्तुओं तक पहुंच है) हम सार्वजनिक भूमिका को प्रतिबंधित करने का प्रयास कर सकते हैं।
यह कई कारणों से आदर्श नहीं है। उदाहरण के लिए, इनकार> अनुदान और परिणामस्वरूप sysadmin
भूमिका में केवल सदस्य ही इस टीवीएफ से चयन कर पाएंगे।
एक और महत्वपूर्ण बात यह है कि अतिथि उपयोगकर्ता / सार्वजनिक भूमिका को बदलने से उदाहरण या कुछ कार्यात्मकताओं पर अज्ञात दुष्प्रभाव हो सकते हैं।
USE MASTER
GO
DENY SELECT ON [sys].[dm_os_enumerate_filesystem] TO public;
GO
सार्वजनिक / अतिथि अनुमतियाँ बदलना कोई आदर्श परिदृश्य नहीं है।
उदाहरण के लिए, अतिथि उपयोगकर्ता को अक्षम करना msdb डेटाबेस को तोड़ सकता है ।
निहित उपयोगकर्ता के संदर्भ में चयन को पुन: निर्देशित करें:
Msg 229, Level 14, State 5, Line 7 SELECT परमिशन को ऑब्जेक्ट 'dm_os_enumerate_filesystem', डेटाबेस 'mssqlsystemresource', स्कीमा 'sys' से इनकार किया गया था।
आदर्श दृष्टिकोण से इस दूर का कोई रास्ता हो सकता है या नहीं भी हो सकता है, मुझे नहीं मिला।
सार्वजनिक भूमिका की अनुमति का एक उदाहरण:
इन्हें एक कारण के लिए दिया जाता है, क्योंकि इन वस्तुओं को नकारने / निरस्त करने पर ऐसी कुछ कार्यक्षमताएँ टूट सकती हैं। सावधानी के साथ आगे बढ़ें।
अतिथि उपयोगकर्ता / सार्वजनिक भूमिका पर कुछ और जानकारी यहाँ