这可能比听起来要困难得多。如果您尝试从服务器端对象模型执行此操作,那么您很可能会在会话 0 中运行。会话 0 是用于服务的特殊 Windows 会话,它不允许产生新进程。要解决这个问题,您必须使用 Windows API 让用户登录并控制他们的会话,从而退出会话 0。我不会在这条路上走得更远,因为您没有指定您实际上正在这样做。
如果您只是想下载存储在 SharePoint 文档库中的 Word 文档,然后在客户端启动它,您可以使用以下命令下载并打开该文档:
ClientContext clientContext = new ClientContext("http://SharePoint/");
string serverRelativeUrlOfFile = "SharedDocuments/file.docx";
string fileDestinationPath = @"C:\Documents\file.docx";
using (FileInformation sharePointFile =
Microsoft.SharePoint.Client.File.OpenBinaryDirect(clientContext, serverRelativeUrlOfFile))
{
using (Stream destFile = System.IO.File.OpenWrite(fileDestinationPath))
{
byte[] buffer = new byte[8 * 1024];
int byteReadInLastRead;
while ((byteReadInLastRead = sharePointFile.Stream.Read(buffer, 0, buffer.Length)) > 0)
{
destFile.Write(buffer, 0, byteReadInLastRead);
}
}
}
System.Diagnostics.Process.Start(@"C:\Documents\file.docx");
编辑:注意,这使用了 SharePoint2010 客户端对象模型,因为会话 0 隔离使服务器端对象模型的步骤变得相当困难,除非有要求,否则我不会在这里详细说明。
编辑:在评论之后,很明显您正在尝试使用 Webpart 在客户端下载和执行文件。上面的代码来自 SharePoint 2010 客户端对象模型,但是是 C# 版本。既然我已经向您展示了正确的 C# 版本,那么将其转换为 JavaScript 版本应该很容易。这会将文件下载到客户端。下载文件后,使用以下 JavaScript/ActiveX 执行文件:
var objShell = new ActiveXObject("Shell.Application");
var strArguments = "";
var strDirectory = "";
var strOperation = "open";
var intShow = 1;
objShell.ShellExecute(FileLocation, strArguments, strDirectory, strOperation, intShow);
替换正确参数的地方。请注意,这只能在 Internet Explorer 上工作——因为这个显然非常不安全的 ActiveX 部分被每个半体面的浏览器阻止了——而且我只在 IE8 上测试过它。