首页 新闻 会员 周边 捐助

C# 远程打开文件夹

0
悬赏园豆:30 [已解决问题] 解决于 2014-09-05 17:05

在做一个任务,用c#实现数据库的备份还原,如果数据库在本机,已实现OK,但是如果工具不在本机,需要远程连接,就涉及到一个打开远程服务器路径的问题。在Sqlserver里面,备份时选择的路径会是数据库所在机器的路径,我问的问题时,在C#里面,怎样实现类似于 sqlserver里面可以打开数据库所在机器的文件夹?

浪潮的主页 浪潮 | 菜鸟二级 | 园豆:277
提问于:2014-09-05 14:50
< >
分享
最佳答案
0

在数据库做一个服务来实现,只有这个方案了。

 

其它的方案呢,也不是完全没有:

1、如果是在局域网里,有服务器的权限(是AD就最好了)

2、如果不是局域网,是否支持\\host方式访问呢

3、如果不是局域网,可以创造条件建立局域网,比如VPN

以上方案都可行,但是成本太高,还不如在服务器写一个service呢。

收获园豆:10
519740105 | 大侠五级 |园豆:5810 | 2014-09-05 15:05

你说的这几个,可行是可行,可是还要开放另我下台机器的权限和访问方式之类的,sqlserver内部怎样实现的这个打开别的机器的文件夹的方法,没人知道是怎样调用的吗,我们可以想办法调用到这个方法吗?如果不能实现,只好使用别的方法了,同样,感谢您的回答。

浪潮 | 园豆:277 (菜鸟二级) | 2014-09-05 15:13

@浪潮: SQL SERVER也只能打开服务器所在机器的文件夹吧?这个其实就是一个服务实现的,SQL服务本身的功能而已。

519740105 | 园豆:5810 (大侠五级) | 2014-09-05 15:18

@519740105: 是的,其实我是想找到smo相关的操作里面,是不是有这个功能,能打开连接的机器的路径。

浪潮 | 园豆:277 (菜鸟二级) | 2014-09-05 16:18

@浪潮: 这个倒是一个方案,应该在SQLSERVER的允许权限内可行。

519740105 | 园豆:5810 (大侠五级) | 2014-09-05 16:36

@519740105: 嗯,刚和楼上那位大叔也讨论了,smo不知道有没有这样的功能,就是sqlserver在知道对方服务器IP,数据库账号和密码的情况下,如何能选择到路径的问题,因为Sqlserver有这样的权限,我们是不是可以通过对sqlserver sdk的操作,来完成这一功能呢?

浪潮 | 园豆:277 (菜鸟二级) | 2014-09-05 16:49
其他回答(2)
0

做一个服务器端,做一个客户端。两者之间用SOCKET之类通信(SQL Management与SQL SERVER的关系)。

你在管理端看到的不过是服务端看到,然后传过来告诉管理端而已,原理就这么简单。

当然,实际用起来,SOCKET编程最麻烦的就是调试了。

其实,你应该有看过WEB类似的界面,或者说有些木马实现了类似功能。

在这里面IE/CHROME是客户端,而IIS+网站代码构成了服务端。

收获园豆:20
爱编程的大叔 | 园豆:30844 (高人七级) | 2014-09-05 14:54

感谢您的回答,你说的思路应该可以实现,只是还是要在别的服务器上通讯,我主要是想利用Sqlserver的某些特性,或是C#有没有现成的方法, 能打开远程文件夹,就像Sqlserver里面可以选到别的机器的文件夹的功能一样。sqlserver又是怎样实现的呢?

支持(0) 反对(0) 浪潮 | 园豆:277 (菜鸟二级) | 2014-09-05 14:58

@浪潮: 看来你完全没有看懂我说的。

SQL SERVER就是一个Window Service, SQL Management Studio就是一个传话器而已。

如果要用C#备份数据库,当然是备份在客户机了。

服务器备份根本不需要你写代码,吃多了再发明一个轮子,SQL SERVER可以设置自动备份的。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-09-05 15:13

@爱编程的大叔: 大概就是这么个意思,具体如何实现呢?现在在寻找这个轮子。自动备份现在不需要,我现在需要的手工决定选择 客户机的路径和时机。

支持(0) 反对(0) 浪潮 | 园豆:277 (菜鸟二级) | 2014-09-05 16:15

@浪潮:  

完全没有明白你的意思。

1、如果是我做一个工具,大概是这样的,

客户可以输入服务名、UID、PWD、DATABASE,

选择本地路径,按下备份按钮,

软件就开始读数据库,并在本地保存。这个不需要服务器端支持,当然SQL SERVER是免不了的。

2、如果要备份在服务器上,实际上意味着这个服务器就是你完全控制了,但做一个这样的工具,无非是

你可以随时备份,个人感觉用处不大,另外,会给服务器靠成很大的安全隐患。

一般真要做成客户端备份在服务器上的话,只需要提供文件名,甚至有时候连文件名都不需要提供,

服务器设置好了备份路径,这样做法会好点。

 

3、因为完全不知道你的原始需求为什么会造成你想实现这样的功能,所以也只能就事论事。

但希望你从逻辑学角度看待此事。原则上,除非服务器同意,没有任何一台客户机可以获取服务器的文件夹结构的。这里面的同意,实际上就是说服务器上安装有你的木马(Window Service)

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-09-05 16:39

@爱编程的大叔: 同意你的看法,这需求确实有点怪异,奇实就是模拟sqlserver的手工备份还原的功能,你说的第二点,既然sqlserver本身可以读到服务器的路径,我是想代码里是不是也可以做到,对于sqlserver而言,他只是知道这台服务器IP,SqlServer的账号和密码。但是在Sqlserver里就可以做到选择服务器的路径,这不等同于完全控制吧。

支持(0) 反对(0) 浪潮 | 园豆:277 (菜鸟二级) | 2014-09-05 16:47

@浪潮: 

并不是完全不可行的,只是感觉这样安全性很成问题,微软很可能随时修改此项安全设置的。

一般手工备份,让用户指定文件名就行了,甚至连文件名都可以不指定,直接用服务器时间当文件名。

你硬要这样的话,请google sql server folder list,其实也是有一点点可能性的,

http://stackoverflow.com/questions/11559846/how-to-list-files-inside-a-folder-with-sql-server

我感觉这条路逻辑上不通,所以没有试过,你有兴趣可以自己试试啦。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-09-05 16:59

@爱编程的大叔: OK,可能是我最初的问题没有问清楚,我去试试了,thanks!

支持(0) 反对(0) 浪潮 | 园豆:277 (菜鸟二级) | 2014-09-05 17:05
0

sqlserver可以通过类似于下面的sql语句得到某个目录下的文件或文件夹名称。可以通过SQL Server Profiler监控在SSMS界面操作备份选择目录的时候得到

declare @Path nvarchar(255)
declare @Name nvarchar(255)


select @Path = N'C:'



        create table #filetmpfin (Name nvarchar(255) NOT NULL, IsFile bit NULL) 
        if(@Name is null) 
        begin 
            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 from #filetmp f 
            drop table #filetmp 
        end 
        if(NOT @Name is null) 
        begin 
            declare @FullName nvarchar(300) 
            if(@Path is null) 
                select @FullName = @Name 
            else
                select @FullName = @Path     + '\' + @Name 
            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 from #filetmp2 where Exist = 1 or IsDir = 1 drop table #filetmp2 
        end
        


SELECT
Name AS [Name],
IsFile AS [IsFile]
FROM
#filetmpfin
ORDER BY
[IsFile] ASC,[Name] ASC
drop table #filetmpfin
诶碧司 | 园豆:1912 (小虾三级) | 2014-09-06 14:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册