【问题标题】:How I start my winforms app via telnet?如何通过 telnet 启动我的 winforms 应用程序?
【发布时间】:2010-11-01 23:02:40
【问题描述】:

我在客户端机器上有一个 Windows 窗体应用程序。我正在尝试通过 telnet 登录,将其关闭,更新一些文件,然后重新启动。

在客户端机器上使用 cmd 并输入 MyApp.exe 非常适合启动它。但是,如果我在 telnet 窗口中执行此操作,就会发生一些奇怪的事情:应用程序从它现在在进程列表中的位置开始,但它的任何表单都没有打开,也没有完成任何 log4net 日志记录。

发生了什么,我该如何解决?

编辑:这似乎是所有基于表单的 Windows 应用程序的情况。自己尝试一下:telnet localhost => 记事本。它会在用户界面中弹出,但不会在 ui 中弹出!

另外,我在所有这些机器上都安装了RAdmin?据我所知,它没有自动化设施,但也许它有什么可以帮助我的?

【问题讨论】:

  • 发生的事情是应用程序正在启动,但没有与之关联的用户桌面。您将需要找到当前登录的用户帐户并在该用户权限下运行它。如果你在 telnet 用户下运行它,你会得到一个无头显示 - 在大多数情况下它无法与桌面交互。
  • Jason,您能解释一下如何以 telnet 用户身份运行应用程序吗?这台计算机只有一个管理员用户,所以我既可以远程登录,也可以以管理员身份运行桌面。
  • 只是出于好奇,您有什么不能使用远程桌面的原因吗?
  • @Jon B - 那么他将不得不再次手动登录信息亭,不是吗?
  • 没错。我曾经使用远程管理员来执行此操作,但现在我们拥有大约 12 台这样的机器。编写一个 ruby​​ 脚本要容易得多。或者我是这么认为的。

标签: .net windows winforms telnet


【解决方案1】:

编辑:在我原来的回答中,我误解了你的问题,我以为你说你重启了机器。

话虽如此,我仍然可能会尝试采用不同的方法。你能在 MyApp.exe 中设置某种类型的自动更新服务吗?一种简单的方法是设置一个 Web 服务,MyApp.exe 可以轮询该服务以查看何时有新版本可用。然后你需要启动一个更新程序来完成更新工作。

【讨论】:

  • 为什么没有用户上下文?我以用户身份登录 telnet。不想重启机器,只更新程序的dll等系统文件。
  • 好的,我们正在进入一些非常复杂的架构宇航员领域,只是为了解决以错误模式启动的应用程序的问题。如果最坏的情况发生,我可以做一个使用 Process.Start 或其他东西的 2 行引导应用程序,但这只是另一个移动部分,必须有更简单的东西吗?
【解决方案2】:

我认为您的应用正在私人桌面上启动,然后在您关闭 telnet 会话后立即退出。我不知道如何让它在“当前/活动”桌面窗口上启动,但要在您退出 telnet 后保持它运行,请尝试使用“start”命令运行。

【讨论】:

  • 其实我只是想到了这个,如果它只是在私人桌面上启动,那么为什么 log4net 不记录任何东西呢?
  • 如果您立即注销,它可能会在它有时间做任何事情之前退出。但我怀疑这更有可能是权限问题。
【解决方案3】:

您可以尝试使用VNCRobot,而不是使用telnet。我相信 VNCRobot 以用户身份运行,应该共享同一个桌面。

免责声明:我从未使用过 VNCRobot,只是觉得值得一提。

【讨论】:

  • 谢谢,这听起来很有趣,但是当我们已经在这些机器上运行远程管理员时,我无法证明在这些机器上安装更多第三方 VNC 软件是合理的——即使它的自动化程度很糟糕。
  • 所以你安装了radmin.com/products/radmin?我没有在问题中注意到这一点。您可能希望将其编辑到您的问题中,因为通过该工具进行远程登录可能会导致此问题。或者也许不是......但值得一提以防万一。
  • 嗯,我不是通过那个工具远程登录的,我实际上是通过一个 ruby​​ 脚本来做的。或 cmd,或 powershell - 不要特别在意哪一个。然而,我确实编辑了这个事实。也许它有一些我可以使用的实用程序或扩展。
【解决方案4】:

如果您可以在这些机器上运行 PowerShell,则可以使用它来查找正在运行的进程并将其杀死。 ..

Get-Process

..Cmdlet 将向您显示正在运行的进程,您可以编写逻辑以通过此列表进行 foreach 并直接在 powershell 中将您的应用程序与正则表达式匹配,我不知道 Ruby 但理论上您可以使用它来执行相同的调用powershell 命令:

powershell.exe -command Get-Process

杀死一个进程:

Stop-Process <processId>
Stop-Process -processname <processName>

不太清楚如何通过 telnet 启动 GUI 进程,我的设备上没有 telnet 设置。

也许你可以做类似的事情:http://www.peterprovost.org/blog/post/Powershell-Sudo-(sort-of)-for-Vista-UAC.aspx

在该地址的示例中将动词设置为“runas”将调用 UAC,这样做我无法终止新进程,但是如果我设置,我将终止它:

$psi.Verb = "open"

此外,您还可以设置这些属性:

Verb                    : open
Arguments               :
CreateNoWindow          : False
EnvironmentVariables    : {processor_revision, processor_level, logonserver, systemroot...}
RedirectStandardInput   : False
RedirectStandardOutput  : False
RedirectStandardError   : False
StandardErrorEncoding   :
StandardOutputEncoding  :
UseShellExecute         : True
Verbs                   : {open, runas, runasuser}
UserName                :
Password                :
Domain                  :
LoadUserProfile         : False
FileName                : notepad.exe
WorkingDirectory        :
ErrorDialog             : False
ErrorDialogParentHandle : 0
WindowStyle             : Normal

【讨论】:

  • 我遇到的唯一问题是启动该过程。停止它很容易 - taskkill。也没有 powershell,它们是触摸屏哑终端,因此也不太可能获得批准。
【解决方案5】:

在 Windows XP 上,我通过使用 Windows 任务调度程序找到了解决此限制的方法。对于 Windows 7,默认情况下不安装 telnet。

我首先必须通过合并以下注册表设置将本地帐户的网络访问:共享和安全模型更改为“经典 - 本地用户以自己的身份进行身份验证”:

Windows 注册表编辑器版本 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa] "forceguest"=dword:00000000

我将它放在远程 FTP 服务器上的一个文件中,并使用 FTP 命令获取它。

与 regedit /s file.reg 合并

然后我创建了一个运行一次的任务: SchTasks /Create /SC ONCE /RU "user" /RP pass /TN "StartApp" /TR "\"C:\Windows\NotePad.exe\"" /ST 00:00:00

手动启动计划: schtasks /run /tn "StartApp"

已删除日程: schtasks /delete /F /tn "StartAPP"

这很奏效。疯了吧!好痛啊!

【讨论】:

  • 哎呀!抱歉,您必须使用 Windows XP。你应该告诉你的客户升级。
猜你喜欢
  • 2019-10-17
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多