c# – 没有控制台窗口或依赖关系的简单DOM操作

我正在为用户编写一个打开文件的解决方案,这个文件应该导航到某个网站并将用户的用户名插入到他们的登录表单中. Citrix会话上的用户需要访问此文件.

这应该非常简单,我通过Powershell发现了一种方法:

$aduser = Get-ADUser $env:USERNAME -Properties EmailAddress
$emailaddress = $aduser.EmailAddress

$url = "https://website.org/loginpage.asp"
$ie = New-Object -comobject "InternetExplorer.Application"
$ie.visible = $true
$ie.Navigate($url)
WaitForPage 10
$ie.Document.GetElementById("USERID").Value = $emailaddress

这非常有效 – 它打开网页,并插入用户名(电子邮件地址).

但是,当用户从他们的机器运行它时,似乎无法隐藏CMD窗口(如果从.cmd或.bat运行)以及Powershell窗口. -WindowStyle Hidden只是减少了窗口显示的时间长度 – 这不是一个可接受的解决方案.

所以我的下一步行动计划是在c#中重新创建上面的代码并将其作为exe分发(因为这不太可能显示任何控制台窗口).但是,我似乎无法在C#中找到任何不依赖于外部库的方法(例如Selenium,它也需要安装驱动程序,这对我来说不是一个有效的选项).

我想我的问题是 – 可以在C#中重新创建上面的Powershell脚本吗?来自该脚本的-comobject是一个.NET对象,如果是这样,我怎样才能在C#中利用它?

供参考 – 我目前正在调用.ps1文件,如下所示(在CMD文件中):

START Powershell.exe -WindowStyle Hidden -File \\file\Folder\SK\scripts\powershell\opensite.ps1

我还没有找到任何方法来实际隐藏出现的控制台窗口.我要么找到解决方案,要么在C#中实现相同的简单方法.

最佳答案 在
commented above中,您可以通过wscript.exe使用VBScript或Jscript来避免启动另一个控制台窗口.这是一个示例Jscript脚本,编写为批处理Jscript混合.保存它的.bat扩展名,盐味,然后试一试.

@if (@CodeSection == @Batch) @then
@echo off & setlocal

wscript /e:JScript "%~f0"

goto :EOF
@end // end batch / begin JScript hybrid code

var user = WSH.CreateObject("ADSystemInfo"),
    email = GetObject("LDAP://" + user.UserName).EmailAddress,
    url = "https://website.org/loginpage.asp",
    ie = WSH.CreateObject('InternetExplorer.Application');

ie.visible = true;
ie.Navigate(url);
while (ie.readyState != 4) WSH.Sleep(25);

ie.document.getElementById('USERID').value = email;

if (ie.document.getElementById('password'))
    ie.document.getElementById('password').focus();

它实际上是一个多语言脚本,因为您可以使用.bat扩展名或.js保存它.作为.js,您可以双击它,它将启动(假设.js文件与wscript.exe相关联,因为它们通常是默认情况下),根本没有任何控制台窗口.

如果你更喜欢.exe文件,上面的脚本可以很容易地修改成一个自编译和链接Jscript.NET可执行文件的脚本. (此脚本仍会获得.bat扩展名.)

@if (@CodeSection == @Batch) @then
@echo off & setlocal

for /f "delims=" %%I in ('dir /b /s "%windir%\microsoft.net\*jsc.exe"') do (
    if not exist "%~dpn0.exe" "%%~I" /nologo /target:winexe /out:"%~dpn0.exe" "%~f0"
)
"%~dpn0.exe"
goto :EOF
@end // end batch / begin JScript.NET hybrid code

import System;
import System.Diagnostics;

try {
    var wshShell:Object = new ActiveXObject("Wscript.Shell"),
        user:Object = new ActiveXObject("ADSystemInfo"),
        email:String = GetObject("LDAP://" + user.UserName).EmailAddress,
        url:String = "https://website.org/loginpage.asp",
        ie:Object = new ActiveXObject('InternetExplorer.Application');
}
catch(e:Exception) { System.Environment.Exit(1); }

ie.visible = true;
ie.Navigate(url);

// force IE window to the foreground and give it focus
var proc:System.Diagnostics.Process[] = System.Diagnostics.Process.GetProcesses();
for (var i:Int16 = proc.length, hwnd:IntPtr = IntPtr(ie.hwnd); i--;) {
    if (proc[i].MainWindowHandle === hwnd && wshShell.AppActivate(proc[i].Id)) break;
}

while (ie.readyState != 4) System.Threading.Thread.Sleep(25);
ie.document.getElementById('USERID').value = email;
if (ie.document.getElementById('password'))
    ie.document.getElementById('password').focus();
点赞