0

我们有一个胖客户端,它需要访问客户端可能未登录的共享上的资源。客户端可能位于 Windows 域上,也可能是没有域的混合环境,因此用户必须在本地登录到服务器。过去,一种解决方法是在用户桌面上创建一个到共享的快捷方式,这会打开 Windows 资源管理器,它会打开一个密码提示,允许或拒绝访问该共享。如何让用户在不依赖 Windows 资源管理器的情况下登录共享?Windows 资源管理器做了哪些我可以让我的应用程序请求访问共享的操作?

我已经阅读了 c# web app 中网络共享的访问文件,但我在 WinForms 应用程序中执行此操作并希望它是交互式的。我还阅读了 How to prompt for a Password,但该代码只是提示用户输入字符串,而不是调用要求并授予对共享的访问权限的 UI。我宁愿让我的应用程序不知道用户的密码,也不想触发操作系统要求访问网络资源。

4

1 回答 1

2

您可以查看 Win32 API CredUIPromptForCredentials(或 CredUIPromptForWindowsCredential,如果您在 Vista/Win2k8 上运行,您应该检查 winver 以决定进行哪个调用)。

此方法实际上调用了常规凭据提示,但您获得了凭据(我知道这很糟糕)。

PInvoke.Net 的示例代码显示了如何从 C# 调用此函数(在 PInvoke 示例中,如果您在保存中指定了 false,则必须为标志传递 CREDUI_FLAGS.DO_NOT_PERSIST。很奇怪,我知道)。

更多关于安全的伟大的Keith brown wikibook的信息(和非托管样本)

一旦获得凭据(在安全字符串中),您就可以模拟用户访问资源(使用 logonuser)。

而且很丑。我了解您希望 Windows 显示标准提示对话框,并且您不想了解凭据。

我想知道像使用 System.Diagnostics.Process 在远程 UNC 上启动隐藏的 explorer.exe 这样的丑陋黑客是否可以解决问题。您必须找到一种方法来等待用户输入凭据,然后终止生成的资源管理器进程。

于 2009-06-02T17:17:39.080 回答