【问题标题】:Run ClickOnce Application as Administrator以管理员身份运行 ClickOnce 应用程序
【发布时间】:2011-09-24 12:16:26
【问题描述】:

我有一个 vb.net clickonce 应用程序,将由没有管理员访问权限的低级别人员使用。但是,应用程序本身需要将文件保存到服务器上隐藏的文件夹中,并且只允许管理员进行读/写访问。我需要这些用户能够使用应用程序与此文件夹进行交互,而无需让他们自己浏览到该文件夹​​。我尝试过使用几种模拟技术,但都没有奏效。

http://weblogs.asp.net/ralfw/archive/2003/11/24/39479.aspx 是我尝试过的一种。它仍然说访问被拒绝,即使当我运行 Return System.Security.Principal.WindowsIdentity.GetCurrent().Name 它返回管理员凭据。

我尝试创建另一个应用程序,该应用程序仅使用管理员凭据执行 StartProcess,但我尝试启动的文件是 .application 而不是 .exe,所以我得到“指定的可执行文件不是有效的应用程序对于此操作系统平台”错误。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim file_name As String = "file path to .application file"

    Dim p As New ProcessStartInfo(file_name)
    p.UseShellExecute = False
    p.Domain = "domain"
    p.UserName = "administrator"
    p.Password = New System.Security.SecureString()
    For Each c As Char In "password"
        p.Password.AppendChar(c)
    Next
    Process.Start(p)

End Sub

我已尝试为 Internet Explorer 执行 StartProcess,并为 .application 文件提供 url 的参数,该参数一直有效,直到我尝试提供我自己的凭据以外的凭据并且我收到“找不到文件”错误。如果我删除从 p.Username 到 Next 的所有内容,应用程序将打开,但以用户而非管理员身份打开。以下是该尝试的代码。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Dim p As New ProcessStartInfo(My.Computer.FileSystem.SpecialDirectories.ProgramFiles + "\Internet Explorer\IEXPLORE.EXE")
    p.UseShellExecute = False
    p.Domain = "domain"
    p.UserName = "administrator"
    p.Password = New System.Security.SecureString()
    For Each c As Char In "password"
        p.Password.AppendChar(c)
    Next

    p.Arguments = ("URL to .application file")
    Process.Start(p)

End Sub

我完全不知道如何让这个应用程序以管理员身份运行,这样用户就可以只使用这个应用程序查看文件并将文件保存到这个受保护的位置。

【问题讨论】:

  • 哦忘了提到我也尝试将 .appref-ms 添加为我的项目的应用程序引用,并在 processstartinfo() 区域中使用它并且它有效。但是 .appref-ms 文件默认情况下 clickonce 存储在 c:\\user\ 然后是登录用户的用户名。因此,为了使其正常工作,我需要能够动态地将我引用的那一部分更改为登录用户。因此,如果有人知道如何做到这一点,它可能会更容易。谢谢!

标签: vb.net clickonce impersonation


【解决方案1】:

您无法提升 ClickOnce 应用程序的权限,它也无法执行任何需要管理权限的操作。 WCF 服务的想法很有趣。您唯一可以做的另一件事是在您的部署中包含一个执行您希望它执行的操作的 exe 文件,并从 ClickOnce 应用程序以提升的权限运行它。

是的,没错,您不能以提升的权限运行 ClickOnce 应用程序,但它可以启动一个进程,然后可以自行提升权限。

【讨论】:

    【解决方案2】:

    这听起来很适合在服务器上使用 WCF(或其他类型)服务。这将提供方法来做你想做的事。客户端应用程序会调用服务并说“将此文件放在服务器上”,而服务代码是实际保存它的内容。由于它在服务器上运行,因此服务的用户帐户可以拥有必要的权限,而不会出现您现在面临的任何客户端权限问题。客户端用户根本不需要任何权限,除了能够连接到服务。

    另一个好处是您在使用此方法的客户端应用程序中没有管理员帐户密码,这将消除相当严重的安全问题。

    【讨论】:

    • 感谢 Tridus。我不熟悉 WCF,但我会检查一下。
    • 啊。我绝对明白你在说什么。但是我如何确定我的 WCF 中公开的方法将以管理员身份运行?
    • WCF 在服务器上运行,您可以设置该进程(您启动的侦听器应用程序,或者如果您将其托管在 IIS 中,则该特定的 Web 服务器工作人员)以任何您想要的方式运行。但它不应该是“管理员”。它应该是专门为此创建的用户,并被授予访问它需要的任何目录的权限。
    猜你喜欢
    • 2010-12-19
    • 1970-01-01
    • 2011-12-29
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    相关资源
    最近更新 更多