ติดตามการสืบค้น
เมื่อติดตามการสืบค้นที่ดำเนินการด้านล่างแบบสอบถามจะพบว่ามีรายการโฟลเดอร์ในไดรฟ์ทีละรายการ
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\'
สำหรับการเข้าสู่ระบบปกติ
สำหรับการเข้าสู่ระบบปกติมันเป็นเรื่องง่ายเหมือนกับการปฏิเสธการอนุญาตที่เลือกไว้บน TVF นี้เพื่อให้ผู้ใช้ไม่สามารถแสดงรายการโฟลเดอร์
DENY SELECT ON master.sys.dm_os_enumerate_filesystem TO [Domain\LoginName]
เมื่อพยายามเลือกข้อมูลสำรองผู้ใช้ควรเห็นข้อความนี้:
ผู้ใช้จะสามารถเห็นตัวอักษรไดรฟ์เท่านั้น
สำหรับผู้ใช้ที่มีอยู่
สำหรับผู้ใช้ที่มีอยู่การปฏิเสธการเลือก TVF โดยตรงไม่ทำงาน
ผู้ใช้ที่มีอยู่สามารถเรียกใช้ตัวอย่างแบบสอบถามต่อไปได้สำเร็จ
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
เกี่ยวกับข่าวสาร 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];
ทำงานอะไร ในทางทฤษฎี
เนื่องจากผู้ใช้ที่มีอยู่ใช้บัญชี guest / บทบาทสาธารณะเพื่อเชื่อมต่อและเลือกจาก dmv's (บทบาทสาธารณะมีการเข้าถึงวัตถุบางอย่างตามค่าเริ่มต้น) เราสามารถลอง จำกัด บทบาทสาธารณะ
สิ่งนี้ไม่เหมาะเนื่องจากเหตุผลหลายประการ ตัวอย่างเช่นปฏิเสธ> ให้สิทธิ์และเป็นผลให้เฉพาะสมาชิกในsysadmin
บทบาทเท่านั้นที่จะสามารถเลือกได้จาก TVF นี้
สิ่งสำคัญอีกประการที่ควรทราบคือการเปลี่ยนบทบาทผู้ใช้ทั่วไป / ผู้ใช้สาธารณะอาจมีผลข้างเคียงที่ไม่รู้จักในอินสแตนซ์หรือฟังก์ชันบางอย่าง
USE MASTER
GO
DENY SELECT ON [sys].[dm_os_enumerate_filesystem] TO public;
GO
การเปลี่ยนสิทธิ์สาธารณะ / ผู้เยี่ยมชมไม่ใช่สถานการณ์ที่เหมาะสม
ยกตัวอย่างเช่นการปิดใช้งานผู้ใช้ทั่วไปสามารถแบ่ง msdb ฐานข้อมูล
ทำการเลือกใหม่ในบริบทของผู้ใช้ที่มีอยู่:
เกี่ยวกับข่าวสาร 229 ระดับ 14 สถานะ 5 บรรทัด 7 สิทธิ์ SELECT ถูกปฏิเสธบนวัตถุ 'dm_os_enumerate_filesystem', ฐานข้อมูล 'mssqlsystemresource', schema 'sys'
อาจจะมีหรือไม่มีวิธีที่ห่างไกลจากแนวทางในอุดมคตินี้ฉันไม่พบมัน
ตัวอย่างของการอนุญาตบทบาทสาธารณะ:
สิ่งเหล่านี้จะถูกให้ด้วยเหตุผลเนื่องจากฟังก์ชันบางอย่างอาจแตกหักเมื่อปฏิเสธ / เพิกถอนวัตถุเหล่านี้ ดำเนินการต่อด้วยความระมัดระวัง
ข้อมูลเพิ่มเติมเกี่ยวกับผู้ใช้ทั่วไป / บทบาทสาธารณะที่นี่