我先介绍一下我的环境:
关键字:VS.net 2003,C#/Asp.Net/Sqlserver,ODBC,Visio 2003
上面的关键字基本可以说明我的的开发所处的环境。我现在描述一下我对生成组织结构图的大概做法:
Visio生成组织结构图的数据源可以来自于Excel,Txt文件,Exchange server,ODBC。我的组织结构数据保存在Sqlserver2000中。因此我建了一个ODBC数据源。ODBC数据源登录到sqlserver服务器有两种身份验证的方式:windows身份验证和Sqlserver验证。前者在本机或者在域中可以方便的使用;后者在使用ODBC时会提示输入密码。生成组织结构图是在后台以不可见的方式生成的,客户端不需要作交互式的操作(我是BS的客户端)。因此我只能采用不需要输入密码的方式。所以我采用了windows身份验证。但我所在的局域网只有工作组,没有域。因此如果IIS服务器与数据库服务器不在同一台机时需要先建立两台机的信任(可以直接访问另一台机,也可以用net.exe命令来访问),然后在创建ODBC数据源的时候选择windows身份验证并将客户端设置为使用命名管道。这样的设置在Visio中以及使用C#直接访问Visio(winForm)都能正确的输出组织结构图。可以使用System.Diagnostics.Process.Start("net.exe",args);来建立两台机的信任关系。
由于我的系统是BS的,所以我需要将这些功能移植到asp.net中,移植过去后我在web.config文件的system.web节中加上
<identity impersonate="true"/>以使用客户端模拟Asp.Net用户来使用visio,并运行DCOMCNFG.exe为运行Visio配置相应的权限。
当数据库服务器与IIS服务器在同一机器上时是可以正确输出组织结构图的。
但我现在的情况就是不在同一机器上,我使用System.Diagnostics.Process.Start("net.exe",args);先访问目标机器以建立信任关系。但没有用,在生成组织结构数据的时候会出现“找不到数据源的错误"这里还有其他两种附带来的问题和奇怪的现象:
1、自从设置了<identity impersonate="true"/>后,我以前使用System.Diagnostics.Process.Start("net.exe",args);去访问另一台机并随后使用Directory.Exists(filePath)去检查filepath所指的共享目录是否存在的功能也不正常了。永远都说那个目标不存在。我怀疑设置了<identity impersonate="true"/>后影响了System.Diagnostics.Process.Start("net.exe",args);的正确执行。
2、调用Visio生成组织结构图的过程如果数据源不存在或者出什么错很令人恼火。因为在正常情况下他会弹出一个DialogBox让用户确认。当用户确认完后才能做进一步的操作。因此在程序中调用他这个功能时如果出错了用户又无法按确定(Visio是以隐藏的方式运行在服务器端),所以程序永远的停在那里。我查visio的帮助,发现在Application中有个AlertResponse属性,我设置成1,但仍然不起作用。费解。
3、在DCOMCNFG.exe中将默认安全机制的默认访问权限中加上administrator,system,interactive三个用户,默认启运权限那里加上administrator,system,interactive以及internet来宾账号和启动IIS进程的账号,而在Visio的安全性属性那里全部使用默认安全性。你会发觉有意外的发现,这部分我都一下描述不清楚。虽然能正确输出组织结构图,但每次都会生成一个无法结束的Visio进程,这个进程只有重启才能被结束。以上是我在解决生成组织结构图过程的经验和烦恼。相信很多公司都需要生成组织结构图,如果这些问题都解决了,我将会把整个解决方案和源代码整理成文章公布出来。

解决方案 »

  1.   

    >>>Sqlserver验证已经被人处理过了或混合认证方式,应该是不需要输入密码的,在Enterprise Manager里
    看一下是是否设成混合认证了Enterprise manager->Right Click your machine to open its Properties page, 
    go to Security tab>>>System.Diagnostics.Process.Start("net.exe",args);先访问目标机器以建立信任关系if you insist, you need to use impersonationhttp://support.microsoft.com/kb/306158/zh-cn
      

  2.   

    谢谢思归兄的回复。
    根据你的指点我作了如下更改:
    1、将machine.config文件中的processModel节的userName的值由machine改成了System
    2、将web.config中加上
    <identity impersonate="true" userName="STEPHEN\Administrator" password=""/>
    3、在IIS中将该虚拟目录的匿名登录禁用。我在程序中用User.Identity观察到当前用户的确是STEPHEN\Administrator,但仍然没有得到正确的结果。System.Diagnostics.Process.Start("net.exe",args);执行这句的时候如何判断他有没有正确的建立了两台机的信任关系呢?
      

  3.   

    执行这一句代码到底需要配置什么样的权限呢?System.Diagnostics.Process.Start("net.exe",args);同志们,快来顶啊,我为这个问题已经被强烈的打击自信心了。网上文章都说访问网络文件夹需要将<identity impersonate="true">把machine.config中的userName设成System才可以访问。而我的机器上为什么相反啊。我要把machine.config中的userName设成machine,将<identity impersonate="true">这一句从web.config中去掉才能访问网络文件夹,在匿名模式下才能访问网络文件夹。能访问网络文件夹的前提是我手动在操作系统里访问了目标机器,建立起两台机器间的信任。
      

  4.   

    我刚刚看了一些文章,我能让System.Diagnostics.Process.Start("Notepad.exe");正确的执行了。但执行System.Diagnostics.Process.Start("net.exe",args);时还是没反应。另外我在MSDN(http://support.microsoft.com/default.aspx?scid=kb;cn-us;317012#appliesto)上看到这样的片断:
    以下部分介绍如何使用各种资源。如果您启用模拟并且向模拟的帐户授予对资源的访问权限,则可以从本地访问其中的许多资源。但是,在您尝试访问远程资源时,模拟通常不起作用,除非应用程序使用可委派的身份验证机制,例如 Kerberos 或基本身份验证。您还可以使用 COM+ 服务访问资源。在您配置 ASP.NET 辅助进程以使用 System 标识时,该 ASP.NET 辅助进程可以访问本地计算机上的几乎所有资源。在运行 Windows 2000 或 Windows XP 的计算机上,System 帐户还具有网络凭据并可以作为计算机帐户访问网络资源这两段话好像有些不解。第一段中说的访问远程资源时,模拟不起作用。他所说远程资源是指局域内的共享资源吗?如果模拟不起作用那要怎样才能访问呢?
    第二段中的"System 帐户还具有网络凭据并可以作为计算机帐户访问网络资源"的应该是指模拟成系统账号是可以访问局域网内的资源的。但我模拟了为什么还是不行啊。
      

  5.   

    try to set mixed authentication for your sql serverif you insist on using the second method, make sure you use a domain account, you shouldn't need to run net.exe
      

  6.   

    谢谢思归。
    这个问题星期五已解决了。我采用了第二种方法。
    我所在的网络是工作组模式的。
    我是采用以下方式建立IIS服务器和数据库服务器间的委托的:在两台机器上建立一个相同的账号且具有相同的密码。在IIS中的目录安全性那里除默认的匿名和windows身份验证外还选上了基本身份验证。不过基本身份验证好像安全性较差。结贴