Truy tìm các truy vấn
Khi theo dõi các truy vấn được thực hiện, bên dưới truy vấn được tìm thấy liệt kê các thư mục trên các ổ đĩa từng cái một.
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
Hàm chính được sử dụng là sys.dm_os_enumerate_filesystem
, đối với mỗi thư mục được mở, nó sẽ đi sâu hơn một cấp, một ví dụ về cấp độ thứ hai:
select @Path = N'D:\Data\'
Đối với thông tin đăng nhập thường xuyên
Đối với thông tin đăng nhập thông thường, dễ dàng như việc từ chối các quyền được chọn trên TVF này để khiến người dùng không thể liệt kê các thư mục.
DENY SELECT ON master.sys.dm_os_enumerate_filesystem TO [Domain\LoginName]
Khi cố gắng chọn một bản sao lưu, người dùng sẽ thấy thông báo này:
Người dùng sau đó sẽ chỉ có thể nhìn thấy các ký tự ổ đĩa.
Đối với người dùng có chứa
Đối với người dùng được chứa, từ chối lựa chọn trực tiếp trên TVF không hoạt động
Người dùng có thể thành công có thể chạy ví dụ truy vấn tiếp theo
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
Và .... điều này không hoạt động:
use [PartialDb]
GO
DENY SELECT ON [sys].[dm_os_enumerate_filesystem] TO [PartialUser];
GO
Msg 4629, Cấp 16, Trạng thái 10, Dòng 34 Quyền đối với chế độ xem danh mục trong phạm vi máy chủ hoặc quy trình lưu trữ hệ thống hoặc quy trình lưu trữ mở rộng chỉ có thể được cấp khi cơ sở dữ liệu hiện tại là chính.
Các câu lệnh dưới đây hoạt động nhưng chúng không hạn chế người dùng, ngay cả khi nó không phải là một phần của dbrole
vai trò
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];
Làm việc gì Về lý thuyết
Vì người dùng được sử dụng sử dụng tài khoản khách / vai trò chung để kết nối và chọn từ dmv, (vai trò công khai có quyền truy cập vào một số đối tượng theo mặc định), chúng tôi có thể thử hạn chế vai trò chung.
Điều này không lý tưởng do một số lý do. Ví dụ: từ chối> cấp và kết quả là chỉ các thành viên trong sysadmin
vai trò mới có thể chọn từ TVF này.
Một điều quan trọng khác cần lưu ý là việc thay đổi vai trò người dùng / công khai của khách có thể có tác dụng phụ không xác định đối với thể hiện hoặc chức năng nhất định.
USE MASTER
GO
DENY SELECT ON [sys].[dm_os_enumerate_filesystem] TO public;
GO
Thay đổi quyền công khai / khách không phải là một kịch bản lý tưởng.
Ví dụ: vô hiệu hóa người dùng khách có thể phá vỡ cơ sở dữ liệu msdb .
Chạy lại lựa chọn trong ngữ cảnh của người dùng chứa:
Msg 229, Cấp 14, Trạng thái 5, Dòng 7 Quyền đã bị từ chối trên đối tượng 'dm_os_enum Cả_filesystem', cơ sở dữ liệu 'mssqlsystemresource', lược đồ 'sys'.
Có thể có hoặc không có cách nào khác xa cách tiếp cận lý tưởng này, tôi đã không tìm thấy nó.
Một ví dụ về các quyền của vai trò công cộng:
Chúng được cấp vì một lý do, vì các chức năng nhất định như vậy có thể bị phá vỡ khi từ chối / thu hồi các đối tượng này. Tiến hành thận trọng.
Một số thông tin thêm về vai trò người dùng / công chúng ở đây