2012-12-12 3 views
0

Я запускаю следующую команду в сценарии PowerShell, чтобы просто переименовать компьютер. Сценарий будет выполняться с помощью сценария запуска автозапуска GPO, поэтому мне нужно передать учетные данные в команде. Так как я не могу видеть, что происходит со сценарием, если он выполняется при запуске я проверяю его, запустив скрипт при входе в систему как обычный пользователькак передать учетные данные для переименования команды?

(Get-WmiObject win32_computersystem).Rename($NewName,'Password','domain\username') 

Команда возвращает ReturnValue из «5» - Доступ Отказано. Как я могу передать имя пользователя и пароль? (Я понимаю, риск безопасности в отношении пароля в сценарии)

__GENUS   : 2 
__CLASS   : __PARAMETERS 
__SUPERCLASS  : 
__DYNASTY  : __PARAMETERS 
__RELPATH  : 
__PROPERTY_COUNT : 1 
__DERIVATION  : {} 
__SERVER   : 
__NAMESPACE  : 
__PATH   : 
ReturnValue  : 5 
PSComputerName : 

ответ

5

Если вы всегда работает это на той же машине, или связанный с ним счет кочует то IIRC вы можете рассчитывать на DPAPI для хранения ключа, как так:

# Capture once and store to file 
$passwd = Read-Host "Enter password" -AsSecureString 
$encpwd = ConvertFrom-SecureString $passwd 
$encpwd 
$encpwd > $path\password.bin 

# Later pull this in and restore to a secure string 
$encpwd = Get-Content $path\password.bin 
$passwd = ConvertTo-SecureString $encpwd 

# Extract a plain text password from secure string 
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($passwd) 
$str = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr) 
[System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr) 
$str 

Если это не работает, вы можете использовать этот подход, но он не настолько безопасен, как приведенный выше подход:

$key = 1..32 | ForEach-Object { Get-Random -Maximum 256 } 
$passwd = Read-Host "Enter password" -AsSecureString 
$encpwd = ConvertFrom-SecureString $passwd -Key $key 
$encpwd 

# Could easily modify this to store username also 
$record = new-object psobject -Property @{Key = $key; EncryptedPassword = $encpwd} 
$record 
$record | Export-Clixml $path\portablePassword.bin 

# Later pull this in and restore to a secure string 
$record = Import-Clixml $path\portablePassword.bin 
$passwd = ConvertTo-SecureString $record.EncryptedPassword -Key $record.Key 

# Extract a plain text password from secure string 
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($passwd) 
$str = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr) 
[System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr) 
$str 
0

Найдено следующее here:

$credential = Get-Credential 
Get-WmiObject Win32_ComputerSystem -ComputerName OLDNAME -Authentication 6 | 
ForEach-Object {$_.Rename("NEWNAME",$credential.GetNetworkCredential().Password,$credential.Username)} 

Похоже, что вам нужно, чтобы установить уровень проверки подлинности, чтобы иметь возможность передавать учетные данные (необязательно используя CMDLet Get-Credential). Боюсь, у меня нет коробки, чтобы проверить это на данный момент.

Смежные вопросы