2013-10-09 62 views
2

我已經在Powershell 2.0中解決了這個問題,但需要爲舊版應用程序移植到Perl 5.10。如何使用Perl驗證Windows帳戶和密碼?

我有Windows服務帳戶憑據,不能相互傳遞LOGI傳遞給Perl腳本$Account$Password$Account變量包含域名和AD用戶帳戶名稱。我的PowerShell的解決方案(一襯墊):

PS C:\> New-PsSession -Credential (new-object -typename System.Management.Automation.PSCredential -argumentlist '$Account', (ConvertTo-SecureString '$Password' -AsPlainText -Force)); exit-PsSession; 

如果新的PSSession被創建,則帳戶驗證過去了,我得到的輸出到標準輸出,如:

Id Name   ComputerName State ConfigurationName  Availability 
-- ----   ------------ ----- -----------------  ------------ 
    1 Session1  localhost  Opened Microsoft.PowerShell  Available 

如果驗證失敗,我得到的輸出像這樣STDERR:

[localhost] Connecting to remote server failed with the following error message 
: Access is denied. For more information, see the about_Remote_Troubleshooting 
Help topic. 
    + CategoryInfo   : OpenError: (System.Manageme....RemoteRunspace:Re 
    moteRunspace) [], PSRemotingTransportException 
    + FullyQualifiedErrorId : PSSessionOpenFailed 

我可以在我的程序中解析這些結果。我想在Windows上的Perl 5.10中做類似的事情。我想要做的就是測試密碼是否適用於考慮交互式登錄被拒絕的帳戶。有任何想法嗎?

回答

1

使用來自perl的反引號即

my $a = `powershell -command "ls;exit;"`; 
if ($a =~ /pl$/) { 
    print "folder contains a perl file"; 
} else { 
    print "folder contains no perl file (strange)"; 
} 

系統調用,如果這個工程然後用更復雜的文本替換簡單的LS-命令。 Probalby您可能需要詳細說明\「」''''''和''以使其正確。

+0

我也嘗試和PowerShell進程沒有返回。我用Win32 :: Spawn,Win32:Process:CreateProcess,qw(),system(),''花了幾天時間,而且它們都不能在我的調用過程中工作,所以我想知道它是否可以本地化在Perl中無需調用PowerShell進程。 –

+0

你結束了;退出; ? – FtLie

+0

from commandline c:> perl -e「print'123'。\'powershell -command ls; exit \'.432」 – FtLie

2

一個完全不同的方法是直接使用Net::LDAP聯繫AD,但是這會帶來很多新的挑戰。

很久以前,我還使用了類似以下內容(稱爲win ole)。但我不得不放棄win200X服務器。如果可能有任何幫助:(請原諒糟糕的編碼)

但是這實際上會檢查當前用戶是否爲組的成員。 我認爲它也可以用來驗證用戶名密碼。

require Win32::OLE; 
sub GetObject { 
    Win32::OLE->GetObject(@_); 
} 

    my ($module, $database, $mode) = @_; 
    my $env = {%ENV}; #makes a copy, makes it possible to override $ENV for test etc 
    my $oRoot = GetObject("LDAP://rootDSE"); 
    my $domain_name = $oRoot && $oRoot->Get("defaultNamingContext"); 
    my $domain_host = $oRoot && $oRoot->Get("dnsHostName"); 

    $domain_host .= "/" unless $domain_host =~ /\/$/; 
    my $strAttributeName ="sAMAccountname"; #could be userPrincipalName, cn etc 
    my @user_parts = ($user_name); # the last one (i.e. -1) will be the user name 
    my $alias = $user_name; 

    my $group_prefix = $system_info_defs->{adAuthGroupPrefix}; 
    my $strADsPath  = "LDAP://$domain_host$domain_name"; 
    my $objConnection = Win32::OLE->new("ADODB.Connection") 
     or do{warn "Cannot create ADODB Connection!";return undef};#die ("Cannot create ADODB object!"); 
    my $objCommand = Win32::OLE->new("ADODB.Command") 
     or do{warn "Cannot create ADODB command!";return undef};#die ("Cannot create ADODB object!"); 

    $objConnection->{Provider} = ("ADsDSOObject"); 
    $objConnection->Open(); 
    $objCommand->{ActiveConnection} = ($objConnection); 

等等,等等