쿼리 추적
실행 된 쿼리를 추적 할 때 드라이브의 폴더를 하나씩 나열하는 아래 쿼리가 있습니다.
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];
무엇이 작동합니까? 이론에 의하면
포함 된 사용자는 게스트 계정 / 공용 역할을 사용하여 dmv의 연결 및 선택 (공용 역할은 기본적으로 특정 개체에 액세스 할 수 있음)하므로 공용 역할을 제한 할 수 있습니다.
여러 가지 이유로 이상적이지 않습니다. 예를 들어, 거부> 부여 및 그 결과 해당 sysadmin
역할의 멤버 만이 TVF에서 선택할 수 있습니다.
게스트 사용자 / 퍼블릭 역할을 변경하면 인스턴스 나 특정 기능에 대해 알 수없는 부작용이있을 수 있습니다.
USE MASTER
GO
DENY SELECT ON [sys].[dm_os_enumerate_filesystem] TO public;
GO
퍼블릭 / 게스트 권한 변경 은 이상적인 시나리오 가 아닙니다 .
예를 들어 게스트 사용자를 비활성화하면 msdb 데이터베이스가 손상 될 수 있습니다 .
포함 된 사용자의 컨텍스트에서 선택을 다시 실행하십시오.
메시지 229, 수준 14, 상태 5, 줄 7 개체 'dm_os_enumerate_filesystem', 데이터베이스 'mssqlsystemresource', 스키마 'sys'에 대한 SELECT 권한이 거부되었습니다.
이상적인 접근 방식과는 거리가 멀거나 다른 방법이있을 수 있습니다.
퍼블릭 역할 권한의 예 :
이러한 개체는 이러한 개체를 거부 / 취소 할 때 특정 기능이 작동하지 않을 수 있으므로 이유가 있습니다. 조심해서 진행해라.
여기 에서 게스트 사용자 / 공개 역할에 대한 추가 정보